Like many companies, we operate the "offshore model" whereby the bulk of our development team is comprised of developers contracted to us from abroad where relative currency strength works in our favour. India is the most common choice. This model makes a lot of sense for two reasons:
1. As work waxes and wanes, or if times get hard and the team needs to be downsized, the number of people offshore can be increased or reduced easily, and without recruiting or losing permanent members of staff.
2. It's cheap.
However, for me, this model poses two fundamental problems as well; one directly, and one indirectly.
1. Working with developers who aren't in the same office as you is hard. Working with people who aren't in the same time zone as you is even harder. And collaborating with people whose first language isn't English (often on a poor phone line) makes it harder still.
I believe that the impact on productivity [1] caused by these things risks outweighing the financial benefit.
2. Usually there's not much of a recruitment process involved; rarely even a coding test or technical interview. Managers ask the offshore company for another 5 "resources", and on Monday morning there they are on the end of the crackly phone line. However, the offshore team you accrue often have less than a year or two's development experience.
Now don't misunderstand me, I have no issue with junior developers (I was one after all), but I believe that junior developers need support and development - precisely the sort that is usually denied to offshore contractors: training, educational sessions, mentoring and so on. They are often denied access to the business and therefore an understanding of the problem domain and context they're working within.
Considering all of the above, it should come as no surprise that the quality of their output isn't always up to scratch.
However it does come as a surprise to managers when code quality decreases, and team efficiency and morale slowly decays. They never say: "perhaps it's the fact that a large number of the team [perhaps even the majority] are geographically disconnected and not very experienced".
Why not?
The answer lies in one of the great myths of software development: Your team should consist of Designers and Coders.
This is how the myth goes:
The Designers are the permanent, onshore, team. They have the knowledge of the business, and are usually more experienced and (hopefully) have time and money invested in their development. They're the "intellectual capital". They may even be flattered into thinking that they should move away from the daily grind of actually cutting code as that's beneath them. After all, they do Design with a capital D.
The Coders on the other hand are ten a penny, and can be less skilled - after all, all they do is write the code, and implement the design which the Designer came up with. Practically anyone could do that.
Right?
Well my opinion is: Wrong. Absolutely wrong. And here's why: Coding is design. [2]
Almost every line of code I write involves a design decision: Do I use an instance variable or a local variable? Do I make this component request-scoped or globally-scoped? Do I hold this data in a Map or a List?
All these decisions add up to create code which is more or less extensible, performant, resilient, secure, maintainable and so on - and almost all of these decisions are too detailed to be made by the Designer. (Having said that, every now and then you do meet a Designer - who may also call himself an Architect - who creates designs to this level of detail. In my experience these designs are almost as large as the code itself, unwieldy*, and probably full of oversights and mistakes which only become apparent when you actually cut the code).
(* As Martin Fowler [3] points out: For diagrams, comprehensiveness is the enemy of comprehensibility.)
So what does this mean?
It means you should get your experienced developers to write code. They should be both Designer and Coder - with no distinction drawn between the roles.
Let me give you a scenario I've experienced, and seen, many many times.
Working as the Designer, I produce a documented design and go through it with the Coders. The Coders are fairly junior, so this process takes a while.
A few days later I ask to see the code, or I get a code review request. When I look at it, I see that their interpretation of the design isn't exactly how I imagined it.
For some things I can clearly explain to them why the way they've done it is problematic, and I ask them to change it.
But some things are less easy to justify. I know it's not how I would have done it, but it's getting late in the project to refactor things. It seems to work okay - so I say "you know what, just leave it as it is - it's probably fine."
When a production issue occurs three weeks later I realise why it should have been done the way I instinctively thought it should be done.
Sometimes it's not a production issue, but we suddenly need to extend the functionality in a new way which the implementation makes more difficult - but funnily enough if it had been implemented the way I would have done it - had I been the Coder and not just the Designer - it would have been easy to extend in this new way.
A variation on the above is that the experienced developer (the Designer) is so thinly spread that she actually finds she doesn't have time to review all the code the junior developers (the Coders) have produced. This makes issues with the low level design even more likely - and when the production issue occurs, the Designer looks at the code and exclaims "WTF!?" (which means What Terrible Foolishness!)
So on the off-chance you're a manager with the authority to control how your development team is managed and resourced, try giving quality a fighting chance. Abandon the offshore model and give your permanent team everything they need to do their jobs well.
You'll be amazed at the difference it makes.
References:
[1] Zenun et al: The Effects of Teams' Co-location on Project Performance http://extras.springer.com/2007/978-1-84628-975-0/col/dpi.inpe.br/ce@80/2007/01.22.18.46/doc/paper.pdf
[2] The reader who can tell me who first said this wins a Cadbury's Fudge, because I can't find this reference anywhere. It was probably Kent Beck, Ken Auer or Roy Miller.
[3] Fowler, Martin: Is Design Dead?, http://martinfowler.com/articles/designDead.html
Wednesday, 21 November 2012
Tuesday, 24 July 2012
The Meeting
The automated voice of the teleconference lady announces: "Now joining... Name not recorded".
The meeting has started late, and the latecomers are still arriving. This is mainly because everyone has so many meetings to attend, they're still trying to make it from the last late-running meeting to this one. The host starts a pre-amble.
"Okay everyone, first of all sorry we've started a bit late! Can I just - "
The automaton interrupts him: "Now joining... Name not recorded".
"...can I just check - "
"Now joining... Name not recorded".
"...who's on the call?"
There is silence.
"Do we have Jack?"
"Kathy?"
"What about Brad?"
While we wait, I look around the room and take in the cast of characters on our end of the phone.
First there's the Meeting Nomad who, although a project manager by job title, in reality drifts from meeting to meeting and sets up camp behind his laptop where he does other work, without listening to or participating in the meeting he is currently inhabiting. Consequently he learns nothing and adds no value to the proceedings.
Next is Loudmouth whose role is to assert his superiority in all situations, never allowing his complete lack of understanding to become an obstacle to this. He will have to be managed if there is to be a useful outcome, but sadly the ineffective host has none of the required skills to do this.
Next round the table, and sat next to me, is the Junior Developer who has the deepest understanding out of all of us of the issues about to be discussed, but whose lowly rank relative to Loudmouth will necessitate his silence.
To the other side of me are Network Guy 1 and Network Guy 2, invited because most of what we'll be discussing will involve computers, and computers connect to networks. They also will say nothing throughout.
Finally there is the aforementioned Inept Meeting Host who, having ascertained who is on the call, is now having problems with his laptop and is swearing under his breath as he tries to bring up the document we were going to discuss. This regular occurrence surprises only him.
That leaves me. My mission, should I choose to accept it, is to attempt to come away with specific actions and decisions which will be of use to the Junior Developer who has 2 weeks to complete the work.
The Inept Meeting Host has now managed to bring up the document, but has failed to circulate it. He decides to email it round, but unfortunately his laptop claims never to have heard of our WiFi network. There ensues a lengthy period during which time Loudmouth and one of the Network Guys huddle round his laptop and join in with a Random American on the phone in offering suggestions.
(The Random American, incidentally, is only random because I have never heard of him, but from his authoritative tone I assume he is some kind of manager in the vast and bewildering hierarchy of managers there seems to be).
I lean across to the Meeting Nomad.
"Do you know if anyone from Test is coming?" I ask.
He looks up from his laptop and blinks as his eyes adjust to the real world. "Test?" he asks, as if he hasn't heard of this team before. I consider the possibility that perhaps he hasn't.
"You know, Adrian's team. We need someone to test this stuff don't we!"
He frowns slightly. "Do we? No-one mentioned that to me."
I sit back.
Eventually they manage to connect to the Internet, but for some reason Outlook cannot connect.
The Inept Host is now, at someone's suggestion, setting up a Webex in order to share his screen and is in the process of requesting a password reset email since he has forgotten his password, and Network Guy 1 had told him to clear his cookies. No-one has remembered that he is unable to access his email so will be unable to receive the new password.
20 minutes into the hour-long meeting the laptop remembers that it in fact does know the WiFi network, the document is circulated, and we begin.
There is no agenda, but minutes for this meeting (were anyone taking minutes) could read something like this:
- Tedious walk-through of a document which everyone was supposed to have already read.
- Heated discussion around a minor point which Loudmouth knows a lot about. Action: Junior Developer has to ensure code correlates with an obscure standard, presumably in case we decide that this [2 week ill-conceived, poorly-thought-through hack inspired by short-term thinkers in the business with a dismal record in shrewd decisions] is such a good piece of software we may one day decide to put our logo on it and take it to market as an off-the-shelf product.
- Back Office Guy [who arrived, grinning, 46 minutes in] raised the fact that the proposed global solution won't work in the back office in the APAC region [despite his team being invited to all previous meetings, and invited to collaborate on and review all the documents]. Action: Meeting Nomad to "assess the impact" of this [even though we already understand the impact. But this gives him something to do in his next meeting.]
- All agreed that we should organise another meeting for next week to "review the actions from this meeting", and "see where we are" [which will be the same place we are now, but a week closer to the deadline].
As I leave the meeting I speculate on how I might transition to the role of Inept Meeting Host, or Loudmouth and save myself the stress of trying to do a good job. Perhaps there's a work shadowing programme?
Oh wait, I'm late for my next meeting.
The meeting has started late, and the latecomers are still arriving. This is mainly because everyone has so many meetings to attend, they're still trying to make it from the last late-running meeting to this one. The host starts a pre-amble.
"Okay everyone, first of all sorry we've started a bit late! Can I just - "
The automaton interrupts him: "Now joining... Name not recorded".
"...can I just check - "
"Now joining... Name not recorded".
"...who's on the call?"
There is silence.
"Do we have Jack?"
"Kathy?"
"What about Brad?"
While we wait, I look around the room and take in the cast of characters on our end of the phone.
First there's the Meeting Nomad who, although a project manager by job title, in reality drifts from meeting to meeting and sets up camp behind his laptop where he does other work, without listening to or participating in the meeting he is currently inhabiting. Consequently he learns nothing and adds no value to the proceedings.
Next is Loudmouth whose role is to assert his superiority in all situations, never allowing his complete lack of understanding to become an obstacle to this. He will have to be managed if there is to be a useful outcome, but sadly the ineffective host has none of the required skills to do this.
Next round the table, and sat next to me, is the Junior Developer who has the deepest understanding out of all of us of the issues about to be discussed, but whose lowly rank relative to Loudmouth will necessitate his silence.
To the other side of me are Network Guy 1 and Network Guy 2, invited because most of what we'll be discussing will involve computers, and computers connect to networks. They also will say nothing throughout.
Finally there is the aforementioned Inept Meeting Host who, having ascertained who is on the call, is now having problems with his laptop and is swearing under his breath as he tries to bring up the document we were going to discuss. This regular occurrence surprises only him.
That leaves me. My mission, should I choose to accept it, is to attempt to come away with specific actions and decisions which will be of use to the Junior Developer who has 2 weeks to complete the work.
The Inept Meeting Host has now managed to bring up the document, but has failed to circulate it. He decides to email it round, but unfortunately his laptop claims never to have heard of our WiFi network. There ensues a lengthy period during which time Loudmouth and one of the Network Guys huddle round his laptop and join in with a Random American on the phone in offering suggestions.
(The Random American, incidentally, is only random because I have never heard of him, but from his authoritative tone I assume he is some kind of manager in the vast and bewildering hierarchy of managers there seems to be).
I lean across to the Meeting Nomad.
"Do you know if anyone from Test is coming?" I ask.
He looks up from his laptop and blinks as his eyes adjust to the real world. "Test?" he asks, as if he hasn't heard of this team before. I consider the possibility that perhaps he hasn't.
"You know, Adrian's team. We need someone to test this stuff don't we!"
He frowns slightly. "Do we? No-one mentioned that to me."
I sit back.
Eventually they manage to connect to the Internet, but for some reason Outlook cannot connect.
The Inept Host is now, at someone's suggestion, setting up a Webex in order to share his screen and is in the process of requesting a password reset email since he has forgotten his password, and Network Guy 1 had told him to clear his cookies. No-one has remembered that he is unable to access his email so will be unable to receive the new password.
20 minutes into the hour-long meeting the laptop remembers that it in fact does know the WiFi network, the document is circulated, and we begin.
There is no agenda, but minutes for this meeting (were anyone taking minutes) could read something like this:
- Tedious walk-through of a document which everyone was supposed to have already read.
- Heated discussion around a minor point which Loudmouth knows a lot about. Action: Junior Developer has to ensure code correlates with an obscure standard, presumably in case we decide that this [2 week ill-conceived, poorly-thought-through hack inspired by short-term thinkers in the business with a dismal record in shrewd decisions] is such a good piece of software we may one day decide to put our logo on it and take it to market as an off-the-shelf product.
- Back Office Guy [who arrived, grinning, 46 minutes in] raised the fact that the proposed global solution won't work in the back office in the APAC region [despite his team being invited to all previous meetings, and invited to collaborate on and review all the documents]. Action: Meeting Nomad to "assess the impact" of this [even though we already understand the impact. But this gives him something to do in his next meeting.]
- All agreed that we should organise another meeting for next week to "review the actions from this meeting", and "see where we are" [which will be the same place we are now, but a week closer to the deadline].
As I leave the meeting I speculate on how I might transition to the role of Inept Meeting Host, or Loudmouth and save myself the stress of trying to do a good job. Perhaps there's a work shadowing programme?
Oh wait, I'm late for my next meeting.
Friday, 1 June 2012
I no longer need to remember
So I've got all this stuff in "the cloud". It's great, I don't need to worry about backing it up because some gigantic company has set up a trillion servers in vast glacier-chilled vaults to protect my electronic assets. In case of a nuclear world war my letter to British Gas will be safe and sound, as will the holiday snaps from Northumberland and the picture my friend sent me of the guy with the funny tattoos. These files are replicated hundreds of times to ensure they're not lost - and I have no doubt that future civilisations will be able to read my letter to British Gas and fully appreciate, even across the passage of centuries, how annoying that problem with my bill really was.
This, for me, is the beauty of the cloud.
Now of course I'm being slightly facetious - clearly cloud computing represents a huge leap forward in how we think about IT provisioning, and companies are increasingly considering it to reduce the financial overheads of maintaining hardware, and outsource the expertise required to properly manage scalability, security and so on.
But for the home user, what really has changed (apart from the word Cloud popping up everywhere)? There are companies offering services and storage online, same as there were ten or fifteen years ago. They're just different services, and they now offer more storage.
Take, for example, webmail. The fundamental tenets of cloud are true: it's stored and managed out there on the Internet. I need not concern myself with how or where. It will no doubt be replicated on many servers, and I neither know nor care which server is serving up my email about vi4gr4, or the eight hundred emails from Groupon I've received that day.
But now, here's an idea. While online and social media companies continue to persuade us to share our every mindless thought or opinion, keep a note of everything and everyone we encounter (by the way, Evernote team: I am emphatically NOT going to start photographing everyone I meet. That is truly ridiculous), and store images of everything we see to share with our friends, the obvious extrapolation of that trend is this: wire our brains up to the Internet to store our every experience into the cloud. An online memory of everything we do, think, see or feel. CloudMemory (TM). (It's not really a trademark by the way, I just made it up - although I think there is a kind of mattress called this).
It's not a very original idea - I'm sure it's featured in sci-fi movies, and Google are probably developing it as we speak, but consider the advantages below (there must be thousands, but these are the ones with the most profound implications for humankind):
There are also some lesser advantages, such as:
So you see that CloudMemory could be the next big thing (well, there might be some more big things first I guess, like the iPhone 5 with a slightly thinner case, or someone else offering online movie rentals).
<hilarious ending gag>
So I'm off to file my patent for, erm, what was it again?
</hilarious ending gag>
This, for me, is the beauty of the cloud.
Now of course I'm being slightly facetious - clearly cloud computing represents a huge leap forward in how we think about IT provisioning, and companies are increasingly considering it to reduce the financial overheads of maintaining hardware, and outsource the expertise required to properly manage scalability, security and so on.
But for the home user, what really has changed (apart from the word Cloud popping up everywhere)? There are companies offering services and storage online, same as there were ten or fifteen years ago. They're just different services, and they now offer more storage.
Take, for example, webmail. The fundamental tenets of cloud are true: it's stored and managed out there on the Internet. I need not concern myself with how or where. It will no doubt be replicated on many servers, and I neither know nor care which server is serving up my email about vi4gr4, or the eight hundred emails from Groupon I've received that day.
But now, here's an idea. While online and social media companies continue to persuade us to share our every mindless thought or opinion, keep a note of everything and everyone we encounter (by the way, Evernote team: I am emphatically NOT going to start photographing everyone I meet. That is truly ridiculous), and store images of everything we see to share with our friends, the obvious extrapolation of that trend is this: wire our brains up to the Internet to store our every experience into the cloud. An online memory of everything we do, think, see or feel. CloudMemory (TM). (It's not really a trademark by the way, I just made it up - although I think there is a kind of mattress called this).
It's not a very original idea - I'm sure it's featured in sci-fi movies, and Google are probably developing it as we speak, but consider the advantages below (there must be thousands, but these are the ones with the most profound implications for humankind):
- Never worry about printing out your train or flight confirmation again. Having looked at it once, forever after just look it up from CloudMemory.
- "Who is that actor? I've definitely seen him in something recently. Oh wait, I can just retrieve it from my online memory using CloudMemory (TM)!"
- Ever wonder what you just came upstairs to get? Just look it up on your iPhone using the CloudMemory app.
- "Hey, remember that great time we had in Majorca?" "No. I no longer need to remember that time."
There are also some lesser advantages, such as:
- World peace could be brought about. I don't know how, but I'm pretty sure CloudMemory would help.
- Crimes could be solved by allowing people to share certain memories with restricted people, to prove their alibi or version of events is true. It must have been difficult for Murdoch and Coulson, for instance, trying to help the Leveson inquiry but cruelly blighted by a failing memory. They could certainly have benefitted from CloudMemory.
- 2000 years from now no one will be able to claim the existence of visiting deity without providing proof in the form of a hyperlink to an archived online memory. "A reading from the first letter of Saint Phil to the inhabitants of Milton Keynes: And so it was that Bob Holness flew down from heaven in a hexagonal spaceship, to save our mortal souls. But don't take my word for it; see footage here: http://bit.ly/JJmHxd ". That sort of thing.
So you see that CloudMemory could be the next big thing (well, there might be some more big things first I guess, like the iPhone 5 with a slightly thinner case, or someone else offering online movie rentals).
<hilarious ending gag>
So I'm off to file my patent for, erm, what was it again?
</hilarious ending gag>
Subscribe to:
Posts (Atom)