Saturday, March 31, 2007

Mango Liqueur - Fruition


The mango liqueur started about a month ago has now reached fruition. After filtering with cheese cloth, and adding a little sugar (much less than a cup), it is quite tasty. It should improve further as it ages over the next month or so, assuming it lasts that long :-)

Tuesday, March 27, 2007

Starting at ThoughtWorks: First Five Weeks

Well, I've been with ThoughtWorks for just over 5 weeks now, and I thought I'd write down some thoughts before the hiring and joining process got lost in the misty swamp of my memory.

Hiring process
To cut a long story short, I did a phone screen with HR, a coding test and then some fairly quick aptitude and personality tests and finally 3 interviews. You have something like a week to do the coding test and then submit your code for review. I had the other tests and interviews on a single day. Although this sounds pretty horrendous, it actually wasn't too bad. Tests were pretty quick and the interviewers were astoundingly friendly. I finished by something like 3pm in the afternoon, including a lunch break, and surprisingly didn't feel too bad or stressed afterwards.

Induction
As a fairly impressive start, I had 2 days of induction in Melbourne (I live in Sydney). ThoughtWorks arranged drivers, hotel and flight so it was all very smooth. This was lucky as I was pretty jet lagged and confused - I'd just flown back from an overseas holiday not long before. Induction was largely getting a company provided laptop, meeting people and getting an introduction to various internal systems and procedures. As an aside, I've heard that there is now an "immersion" process where you get sent to India for a week or two for induction but can't comment on that.

A few weeks on the beach
When you're not assigned to a client project, you are "on the beach". This means you go into your local office with your laptop. It's really great - there's no particular tasks assigned to you, but the opportunity is there to get involved in a lot of interesting stuff. To give you some examples, here's some of the stuff I've had the chance to do:
  • Write an open source plug-in for Mephisto for ThoughtWorks Studios
  • Be involved in scoping out and estimating for a RFI from a new client
  • Pair with another developer to do code reviews of potential new recruits
  • Help out briefly with a fun project to develop a driver for a USB build light for continuous integration servers (red for broken build, green for good build, etc)
  • Help out on client projects - I was asked to whip up a little proof of concept for JRuby and Java integration and learnt a bit getting this set up
  • Do a little bit of Google Maps integration
  • Meet colleagues and learn more about procedures etc
  • Get invited to lunch with the managing director - this is something that happens for all new hires and I think it's really great
  • Almost go out on a pre-sales call (I've got to go back to Melbourne and will miss this unfortunately)
  • Catch up on tech reading such as blogs, books etc
  • Go to a swanky talk given by Martin Fowler and Kristan Vingrys
  • Eat lots of free lunches (usually twice a week) and attend various talks at the office given by other consultants
  • Drink lots of free coffee (ThoughtWorks has a coffee tab with a local cafe)
First project
Much fun as it is on the beach, after a few weeks, I was itching to join the big boys and go on a project. Getting assigned to a project is the purview of your professional services manager, and can be pretty changeable. The saying is that "you don't really know what project you're on till you walk in the door of the client site" and I've even heard "you don't really know what project you're on till you're on the plane home". There's a grain of truth in these - it can look like you are going to go on a project and then it doesn't come through, or some other project becomes more important or whatever. I almost went on several different projects before finally ending up on quite a cool Ruby / Rails project with a startup in Melbourne. So, I got to join the jet set and have been flying down to Melbourne during the week, and back for the weekends. This is a bit tiring, but ThoughtWorks does its best to make things comfortable. I'm staying in a really nice corporate apartment in Melbourne, flights are arranged and paid for and drivers are scheduled for pickup and drop off to the airport. There's also a generous per diem allowance for food. The project is really cool, and I'm enjoying it, but can't say more as it is under a NDA.

Back on the beach.. but only for two days!
My first project was two weeks, so after that I returned to the beach. Today is my second day on the beach. However, it turns out that the client was very happy with our first two weeks work and they've invited us back again until Easter. This means I need to fly back to Melbourne tomorrow. This won't continue indefinitely though - when I was discussing the project with my professional services manager, we agreed that I would not need to stay on a Melbourne project for more than 6 weeks. And clearly this is in ThoughtWorks interest as well - it costs a lot more to fly somebody in from Sydney every week and provide accommodation etc. I'm going to be transitioning off the project by Easter and a Melbourne based consultant is going to take over from me if the project continues further. It'll be good to be on a Sydney based project again but I feel it would be unfair not to say that ThoughtWorks has done a really good job in making working in another city as convenient and pleasant as possible.

Various benefits
ThoughtWorks is pretty generous in the expenses department. They cover your mobile phone, home internet, per diem when away, give an allowance for training courses and books, etc. There's also lots of free lunches, food, coffee and catered events.

Transparency and knowing what's going on
I've been quite impressed to get a monthly update email that talks about ThoughtWorks plans, goals and financials, headcount etc in significant detail. There's also various update meeting where you get to hear how projects are going and what's happening with various clients. Personally I'm really glad to see this type of thing, as at previous jobs, this has been privileged information, and most of the time, I have not really had any idea how well the company is doing financially as a whole, or what the future plans and directions are.

Variety and Unpredictability
These are really two faces of the same coin, and depending on your character and experience, I think you might either love or hate this. You really don't know what project you're going to be working on, what your role will be, what industry the client is in, what type of development they need or for what platform or in what language. In fact, you don't even know what city you're going to be in during a given week. I'm enjoying this at this point as my last job was always in the same office, with the same technologies etc. However, I can see it may be trying in the long term, and it does make it difficult to do the shopping or organise things with friends during the week. On the other hand, I have heard that most of the work in Sydney is for big companies like banks and telcos in the city CBD within walking distance to the office, and the majority in Java. So perhaps my short experience so far is not the norm.

In conclusion...
So far, I can honestly say that it's been really great working at ThoughtWorks. I've had a chance to do some of the stuff I've wanted to do for ages like work on a bit of open source and do some commercial Ruby on Rails work. My colleagues have been friendly and welcoming, and I've been wowed by the level of care that ThoughtWorks takes of its employees.

Monday, March 26, 2007

A few choice quotes from "The Unbearable Lightness Of Being" by Milan Kundera

Starts slowly with quite a philosophical bent, but becomes really compelling once the main characters are introduced. Some memorable quotes:

Happiness
"If Kerenin had been a person instead of a dog, he would surely have long since said to Tereza, 'Look, I'm sick and tired of carrying that roll in my mouth every day. Can't you come up with something different?' And therein lies the whole of man's plight. Human time does not turn in a circle; it runs ahead in a straight line. That is why man cannot be happy: happiness is the longing for repetition."

Love
"The brain appears to possess a special area which we might call poetic memory and which records everything that charms or touches us, that makes our lives beautiful... Their love story did not begin until afterwards: she fell ill and he was unable to send her home as he had the others. Kneeling by her as she lay sleeping in his bed, he realized that someone had sent her downstream in a bulrush basket. I have said before that metaphors are dangerous. Love begins with a metaphor. Which is to say, love begins at the point when a woman enters her first word into our poetic memory."

A feeling of importance
"We all need somebody to look at us. We can be divided into four categories according to the kind of look we wish to live under. The first category longs for the look of an infinite number of anonymous eyes, in other words, for the look of the public...
The second category is made up of people who have a vital need to be looked at by many known eyes. They are the tireless hosts of cocktail parties and dinners...
Then there is the third category, the category of people who need to be constantly before the eyes of the person they love. Their situation is as dangerous as the situation of people in the first category. One day the eyes of their beloved will close, and the room will go dark..
And finally there is the fourth category, the rarest, the category of people who live in the imaginary eyes of those who are not present. They are the dreamers."

Kitsch
"Kitsch is the absolute denial of shit, in both the literal and the figurative senses of the word; kitsch excludes everything from its purview which is essentially unacceptable in human existence...
Kitsch causes two tears to flow in quick succession. The first tear says: How nice to see children running on the grass! The second tear says: How nice to be moved, together with all mankind, by children running on the grass! It is the second tear that makes kitsch kitsch. The brotherhood of man on earth will be possible only on a basis of kitsch...
And no one knows this better than politicians. Whenever a camera is in the offing, they immediately run to the nearest child, lift it into the air, kiss it on the cheek. Kitsch is the aesthetic ideal of all politicians and all political parties and movements...
In the realm of totalitarian kitsch, all answers are given in advance and preclude any questions. It follows, then that the true opponent of totalitarian kitsch is the person who asks questions...
From that time on, she [Sabina] began to insert mystifications into her biography, and by the time she got to America she even managed to hide the fact that she was Czech. It was all merely a desperate attempt to escape the kitsch that people wanted to make of her life."

Monday, March 19, 2007

Contact / Feedback Form Plugin for Mephisto

Introduction
If you use Mephisto, a content management / blogging system written in Rails, you may well be interested in using this new plug-in. It provides a form that lets visitors to your site leave their contact details and send you messages or feedback via email.

License
This plug-in was developed for the new ThoughtWorks Studios site. As I wrote it at and for work, it is copyright ThoughtWorks, 2007. However, ThoughtWorks, being generous souls, is happy for me to open source it under the Apache 2.0 licence, which pretty much means you have free reign to use it as you want.

Requirements
  • Mephisto Edge (the latest stable 0.7.3 release does not have support for Mephisto plugins)
  • Rails Edge (required by Mephisto edge)
  • ActionMailer (comes with Rails) correctly configured with SMTP server etc, so that emails can be delivered. See "Configuration" section here for more details.

Installation
ruby script/plugin install http://mephisto-contact-form-plugin.googlecode.com
/svn/plugins/mephisto_contact_form

or in your vendor/plugins directory for Mephisto:

svn checkout http://mephisto-contact-form-plugin.googlecode.com
/svn/plugins/mephisto_contact_form mephisto_contact_form

Make sure you restart your web server at this point so that the plugin is loaded.

Setup
1. Create a new template called 'contact_us.liquid' though the admin web interface (under the 'Design' tab).
Paste in the following code:

<H1>Contact Us</H1>
{% contactform %}
<p>{{ form.name }}<label for="author"><small>Your name</small></label></p>
<p>{{ form.email }}<label for="email"><small>Email address</small></label></p>
<p>{{ form.phone}}<label for="phone"><small>Phone number (optional)</small></label></p>
<p>{{ form.subject}}<label for="subject"><small>Subject</small></label></p>
<p>{{ form.body }}</p>
<p>{{ form.submit }}</p>
{% endcontactform %}

Feel free to modify labels, layout etc.

2. Edit
{MEPHISTO_ROOT}\vendor\plugins
\mephisto_contact_form\lib\contact_notifier.rb
and put in the email address you want contact form submissions to go to.

3. Link to "/contact_form" from your site.

Any issues / questions / suggestions?
Best to post comments on this blog.

Technical Info
The contact form plugin is actually a combination of a rails plugin, a liquid block plugin and a Mephisto plugin. See this post about developing Mephisto plugins for more information.

Thursday, March 08, 2007

Wing Chun: Bong Sau Tips

Today my class was visited a very talented high level instructor. Although he only spent a few minutes looking at my bong sau, he gave two invaluable tips:
  1. When bringing your hand and arm up into bong sau, you need to be moving both upwards, forwards and inwards towards the centre simultaneously. A good way to do this is to imagine your elbow tracing an arc through the air from start to end point.

  2. When moving from bong sau to tan sau when rolling, move into fook sau first, and then roll your wrist over. This will stop your hand from dropping and will leave your hand on the centre line.

Monday, March 05, 2007

The Secrets of Consulting by Gerald Weinberg

The Secrets of Consulting by Gerald Weinberg is one of the most entertaining (largely?) non-fiction books that I have read - a heady mix of How to Win Friends and Influence People, Fear and Loathing in Las Vegas (just look at the illustrations!) , and the 10 Commandments. The book provides general advice, case studies/stories and then derives general "rules" and recommendations from these.

Personally, I found the chapter on the pricing of consulting to be particularly interesting. Thinking about setting a price previously, I would have suggested it should be enough to cover costs and make a bit of a profit. Weinberg points out that price is more than this - it is a big factor in the relationship and the level of respect for the consultant.

The Weinberg's consulting "rules" are quite numerous - my personal favourites are:
  • "If you can't fix it, feature it."
  • "It may look like a crisis, but it's only the end of an illusion."
  • "You'll never accomplish anything if you care who gets the credit."
  • "If something's faked, it must need fixing."
  • "The name of the thing [label] is not the thing."
  • "It tastes better when you add your own egg."
  • "You don't get nothin' for nothin'. Moving in one direction incurs a cost in the other."
  • "Whatever the client is doing, advice something else."
  • "What you don't know may not hurt you, but what you don't remember always does."
  • "Clients always know how to solve their problems and always tell the solution in the first five minutes."
  • "When change is inevitable, we struggle most to keep what we value most."
  • "The biggest and longest lasting changes usually originate in attempts to preserve the very thing ultimately changes most."
  • "Effective problem-solvers may have many problems, but rarely have a single, dominant problem."
  • "Make sure they pay you enough so they'll do what you say. The most important act in consulting is setting the right fee."
  • "The more they pay you, the more they love you. The less they pay you, the less they respect you."
  • "Spend at least one day a week getting exposure." and "Spend at least 1/4 of your time doing nothing." and make sure your fee covers this.
  • "Set a price so you won't regret it either way."
  • "If they don't like your work, don't take their money."
  • "Cucumbers get more pickled than brine gets cucumbered."
  • "Give away your best ideas."
  • "Look for what you like in the present situation and comment on it."
  • "Study for understanding, not for criticism."
  • "Never promise more than 10% improvement.. if you happen to achieve more than 10% improvement, make sure it isn't noticed."
  • "Consultants tend to be the most effective on the third problem you give them."
  • "The child who receives a hammer for Christmas will discover that everything needs pounding."

Mango Liqueur

Started a quick mango liqueur this evening. Two large fresh mangoes worth of pulp (approx 500ml) mixed with 500ml of vodka in a jar. Planning to shake every few days for the next few weeks, filter and then add about 1 cup of sugar, before maturing for a few months. I have high hopes, as a similar recipe worked well with bananas in the past.

Thursday, March 01, 2007

_vimrc for Ruby

In the past I've used gvim for Ruby coding. It's been pretty good, especially with the new tabbed editing and omni complete (bit like intellisense in Visual Studio) introduced in vim 7. However, when I downloaded vim at work, I was missing the secret sauce - a good vimrc. Here's my usual vimrc for ruby:
set nocompatible
behave xterm
set selectmode=mouse
set nu
set tabstop=2
set shiftwidth=2
set softtabstop=2
set ai
set columns=100
set lines=70
set guifont=Courier:h10
set expandtab
set smarttab
let g:rubycomplete_rails = 1
Among other things, it makes the default window size bigger, uses a prettier font, sets up auto indenting ruby style, and turns on omni-complete.

By the way, on windows, assuming a default install, vimrc is to be found here:
C:\Program Files\Vim\_vimrc