Archive for October, 2009

X is dead. Long live X.

Monday, October 19th, 2009

The last couple of weeks, there has been a flurry of “X is dead” blog posts. Have your pick: Java, ORM and a lot of other things have been declared dead. Rest in peace. Pushing up the daisies. There is a new technology on the block now.

The inevitable answers are usually not far behind. X is not dead after all. You insensitive clods. And I happen to think the coffin should be black, thank you.

I wish people would take half a step back. Yes, technologies become outdated. Then they die, or linger on, doomed to a Cobol-esque existence in projects without the funding and need to evolve. Get over it. The new technologies will also become obsolete, I guarantee it. Struts is now uncool. I can remember how nice it seemed when it appeared.

The interesting question is how your project can get rid of “dead” technologies, which usually means technologies that are now “uncool” because the in-crowd are not using them any more. Can you do that in your projects? What technologies can you swap out for something different? How often would you want to do that? What would the costs and the benefits be? How can you reduce the costs of getting a project to become dynamic and less technology-bound?

Ave artis nova, simili artis seneca.

Intelligence and hiring practices

Sunday, October 18th, 2009

I found a weekly in my mother-in-law’s flat today, with a relatively long article on intelligence (good), and why having an IQ of 180 didn’t necessarily mean you were able to get a good job (presumably bad, depending on your definition of “good”).

I started interviewing potential developers for positions around six years ago. Since then, I have seen a lot of resumes, and I have talked with a lot of people. The reason why I am writing this is that a friend of mine, who is a top-notch developer without any managerial experience told me he envied me because I have an insight into how an interview works from the employer side. Most people tend to get this wrong, so I will try to explain how my head is bolted together when interviewing. Hopefully, other people will think the same way.

Norwegian schools and intelligence

The backbone of the article I referred to seemed to be an assumption that very smart people get bored in the norwegian school system, and that Mensa is a kind of support group for the poor people who are cursed with an above average intelligence. There were quotes along these lines, at least, but I will try not to tar all members of Mensa with the same brush. The idea was that school work was so ridiculously easy that being interested in it was a bit beneath these people.

When I was at university, we had to jump through a number of hoops in order to graduate. Some of these hoops were knowledge-based (I remember a course called MA-105 with fondness). These courses were designed to be harder than adequate, prompting most students to have some thoughts about whether they wanted to go through with their studies, or to find something else to spend their time on.

The other kind of test put into the coursework was a test of willpower. Many students spent a lot of time finishing their M.Sc. thesis. Part of the reason was that the earlier grade of Cand. Real. was twice as long, and faculty had not completely caught up with this fact. Another reason was that students were mostly left to their own devices. Finishing the thesis was a different kind of filter. If you hired one of these people, you knew that you were getting a reasonably smart person with a will towards doing something.

Keeping students around indefinitely is a costly proposition, so these studies have now been restructured to provide much more guidance, forcing the students through the system faster. The downside is that candidates have not been sieved the same way as they were before. Employers have had to compensate for this.

This is why I think there is a broken premise in the article I read. The article is based on the premise that extremely intelligent people can do whatever they want. This is garbage. Intelligence is only one part of the equation. There are persons out there who are both highly intelligent and simultaneously too lazy to work at something for a significant amount of time. I don’t believe there is any connection between these two personality traits.

What does this mean for my interview?

There are literally thousands of pages out there explaining how to put a sensible CV together. The goal of these pages is to get you to an interview. From there on out, you are on your own. What happens in the interview is mostly a private affair.

Putting a good CV together is a very, very important task. It is not common for senior developers to read through 250 CVs. The contents of the CV is the first toll gate that gets you closer to an interview. If an employer gets 250 CVs, only three or four people get an interview. The other 245 people are – hopefully – not right for the job.

Sometimes, the sieving process means your CV will not get read. A local employer is known to have divided a bunch of CVs in two, binning one half while saying that he didn’t need unlucky employees. In other words, not getting an interview does not mean you are unsuitable. You may just be unlucky.

There are ways to grab attention. A girl who was applying for a position five years back tried to bribe her way into an interview by offering a hot balloon ride. It was all done with humour, and I still remember the CV to this day since she managed to tickle my interest. This is a bit dangerous since it depends on the interviewer sharing the same kind of humour as the candidate. Oh, and by the way, she didn’t get an interview, and I didn’t get a balloon ride, but it was a very close call.

Another guy in the same bunch of CVs was not that lucky. I was given a 5 cm wad of CVs. About 25% of that thickness turned out to be one CV. This bloke had added copies of everything – even a copy of his boy scout knots award. I also remember this CV for much the same reason – it gave me a laugh, even if it was more of an exasperated one.

The final CV I want to mention is the electrician with a six week course in building PCs who applied for a senior developer position. Take care to understand what the position is, and don’t apply if you are clearly not eligible. You will be seen as a time waster.

I will look at your positions, I will look at the technologies you claim to know. I will have a look at your cover letter – if you say you are interested in switching pastures, I may still have room for you. The ones I think best match the skill set I need, who will be willing to work for the money I have, and who seems to fit socially with the team I want to build will get the interview. It is that simple, and that hard. Prospective employees usually have no idea how I want my team to be built.

There are other ways to get my attention. If you know someone I trust, you should get them to give you an introduction. If the introduction is good and I have good experiences with referrals from this person, you will almost certainly get an interview.

So, let us say you have been able to get an interview. Now what?

Time for the interview

Norwegians are usually an informal lot. I usually wear a sweater, t-shirt and jeans to work. I may wear a suit if I feel like it, but I usually don’t. It would not be playing the part of techie hereabouts. I want you as a candidate to dress much the same as I do, but a little neater. Business casual is good. A three-piece suit will earn you a couple of questions to try to figure out what is happening. Turning up smelling of sweat, and possibly stale beer, is a surefire way of losing the interview on the spot. Talks with employees about the need for personal hygiene are not experiences I cherish.

When the time comes to meet, we will probably meet on neutral ground, which means the reception or somewhere like it. I will offer you coffee, water or something else, and try to put you at your ease. If you are very nervous, skip the coffee and take water instead. When you are in the meeting, try not to use your mug or glass of water as a lifeline. Many people – myself included – grab onto something for comfort when they are under pressure. That is all fine, but you may be holding onto the cup when you should have been pulling out some paper to draw something for me.

Most people are very, very nervous. There is no need to be. My job is not to kill or maim. My job is to find out if we should work together. I really won’t bite. So try to relax, yeah?

There are two ways we might start. If nobody has done it before, I will present the company and what it does. If someone else has already done that, I will pare it down, and just describe myself and what I do.

I think there are two ways the remainder of the interview can work out. If you are talking to a senior techie who has lost his touch, and is willing to do full-time administration, you will probably breeze through the interview. I would ask myself if I really wanted to work for an architect like that.

The why…

Now, here is a dirty little secret: I don’t care if you know the contract of the equals method in the java Object class. I may ask, but the contract is not the endgame. You can look the contract up if you need it. My goal is to get you talking about contracts, equality, possibly cross-references to Haskell, ruminations on how hard it is to implement equals, why you are fed up with ORM, have I tried the new eclipse plugin that does this, that or the other, …

The details are not interesting. When I ask someone why they prefer to develop on Ubuntu, I don’t care about their reasons. I care about the reasoning that lead them to the decision. A developer who says he prefers jetty over tomcat probably has some reason for it – even if the reason only is that he has never seen a reason to fix something that works, and haven’t been able to prioritize toying with other containers. I want you to show me that you are not just parroting what other people are doing, but that you understand the reasons behind what you do.

The how…

I will probably also ask quite intricate questions about stuff you say you are proficient with. Sadly, the term “expert” is very variable. “Expert” from one CV means beginner-level, while another CV might hide world-class knowledge. I have had people claiming to know unix well not be able to tell me what services were running on one of my boxes. I need to know this stuff in order to map your skill set against my expectations, but it doesn’t mean much either way. Competent people are able to pick up technology fast. I will need to know if you need teaching.

I will also try to figure out how you learn. Do you read books? Blogs? Go to conferences? Do you participate in something that gives you knowledge? What do you do on your time off? For norwegians – are you comfortable reading english books? Speaking english? How about italian?

… and how it all works together

There is still a relatively large amount of developers out there who do code-and-fix. I need to know how structured and disciplined you are. I will try to draw you out on this, and you should let me. Most of the people I interview have absolutely no idea how their code production process works. How do you handle bugs? Have you got any personal little quality improvement procedurettes you use? How many years were your projects meant to live?

All of this goes towards giving me an idea of how structured you are. I think this is much more important than knowing technologies. I can teach technologies, but how do you teach being structured? How do you make a kid tidy his room? And do I want to teach a 30 year old developer how to write tidy code? Probably not.

After a slightly extended hour or so, I will probably start winding down. I will progressively give you a looser and looser rein in case there is something you want to tell me – stuff you know, and which I haven’t been able to drag out of you.

Don’t lie by omission

A while ago, I was in an interview with a bloke that waited until this last moment to tell me he had already signed a contract with a different company. He couldn’t get out of this contract. I cannot for the life of me understand why he didn’t call me before the interview to tell me this. His CV was good, and he would probably have gotten an interview when his contract ran out after a couple of months. He left me doubting whether I can trust him. Don’t do that. It can’t help your chances. Be honest.

– oh, and if you are looking for a job in the Oslo area as a senior java developer, my company is hiring right now.

TDD and trivialized neural networks

Wednesday, October 7th, 2009

Neural networks

I just read an article by uncle Bob, and I am left with a feeling that I have been around this loop before. Let me clarify.

Kent Beck’s TDD book espouses writing tests that test the actual cases you want to work. You then write just enough code to make the test run – YAGNI, right?

Then you write another test, and add some more code to make that run. Rinse and repeat.

I have seen this before. I have a background from electrical engineering, and this is the straightforward way of teaching a trivial neural network how to connect itself. The results may be totally inexplicable. One of the first examples was a team that tried to get an FPGA to implement a full-adder by iterative improvements.

They ended up with a chip that had loops in there, not obviously connected to anything else. If these loops were removed, the circuit stopped working. The bits that were connected to something did not look like a regular design, created by an engineer.

Similar studies have been done using analog electronics. The University of Oslo successfully synthesized an XOR gate using subthreshold logic in the early nineties.

In other words, we have been here before. We have ten years of knowledge beyond the simple approaches described in the early nineties. This is why I had a feeling of having been around this bend of road before.

Learning how to ride

I think TDD in its simplest form, which can be found in Kent Becks book, is a very good way of learning how to use TDD. The practice has been reduced to a simple set of rules which can be followed by anyone, and which will produce results which yield a working system, given enough time. It is a bit like learning to ride a bicycle. Anyone can, given enough invested time, learn how to do it, and the practice has been designed to give small and frequent improvements.

This does not mean that everyone must continue to use the same approach when they have learned to ride. I am sure the riders in the Tour de France have a totally different approach to riding a bicycle – an approach which gives them the ability to do stuff that seems inhuman to lesser beings. In order to do this, they are doing all kinds of weird stuff, like going on 200km long rides, getting hideously expensive bikes, and – sadly – abusing illegal substances.

I think TDD is the same way. What makes sense for a beginner does not necessarily make sense for experienced practitioners. And still I see people discuss how the One Right Way of doing TDD should be. I don’t think there is one.

Emergent evolution and productivity

There is a software developer somewhere writing the tests that drives by-the-book TDD. The tests, and the incremental improvements described in TDD, will give a system that evolves over time. A known problem with the kinds of evolution possible with these kinds of rules is that they seek out a stable solution – not the best stable solution, but a stable solution. For a system as a whole, this is not an issue. It is tough on the individual organism.

The problem with applying neural evolution to software development is that software development is both slow, and linear. By linear, I mean that a team usually only evolves one version of a system. Several companies may develop a handful of versions, but still a statistically insignificant portion of the possible number of solutions. It is also not nice being one of the organisms (companies) with a substandard solution – you are going to be in a world of hurt if a developer comes up with a different, and better, solution.

Hopefully, the developer knows a bit more about what is going to happen in the future than what the tests show. I feel he should also be part of the equation, possibly because I see myself as a software developer. I am hoping here that more knowledge put into the design process will give a better solution.

Sadly, there are some managerial thoughts going around our profession which toy with the idea that developers are replaceable cogs. If you can find a cheaper developer, go for it. The solution is going to become cheaper, right?

The problem with that is that some studies point to there being a factor ten difference in developer productivity. How interesting is it to save 50% of the money if the new developer only produces 10% of the value? You are going to need four more developers to keep the speed up, which is going to give you 2.5 times the effective cost.

Developer productivity should obviously be part of the equation. I feel quite strongly that the ten-fold increase in productivity that has been reported may have something to do with the knowledge sitting in the heads of developers, since there is a very hard limit to how fast it is possible to type. Therefore, applying strict YAGNI and pure-bred TDD may not make sense – if you have developers who give above average return for your money. And you do, right? Otherwise, why did you hire them?

Slack

How can you tell if your developers are of the few who should be given some slack?

First of all, this has absolutely nothing to do with age. I have people on my team with two years of experience who outperform people I know with ten years of experience. Getting hold of old developers will probably yield a bunch of administrators. Our profession seems to promote the best developers to managerial positions, with another sizeable chunk taking managerial positions by themselves. Alistair Cockburn said he does a “tech reset” every five years to keep his hand in. I am very glad one of the most prominent figures in the industry said that. All too few senior (as in grey hair, not skill) developers actually do this.

I have only found one way of being absolutely sure of who to cut some slack, and that is to actually do it. Let them decide how to go about things. Set reasonable expectations, and follow up after delivery on what happened. Make sure that you are talking to the person who has actually done the work – some developers are political animals, and will happily take credit for work done by others.

After six months or so, one or two of the developers in a team usually stand out as better-performing. You want more of the mojo these guys or girls have. These guys should be given time – not time off, but given time – to do what they do best, which is analyze, come up with improvements, understand the business and help the other developers become better developers.

The downside of this is what the rest of your developers will be getting up to. One or two of the rest of your team will have spent the slack you have cut them to implement their own quicksort libraries instead of providing business value, have actually been slacking around, or have created code that contains critical bugs. There is no way of finding the stars of the team without also finding these people.

I prefer actually finding these people rather than having them live as submarines in the team, only visible through their shoddy work bubbling up through the waters when a deadline looms. Knowledge is the first step towards actually doing something about the situation.

For a far more eloquent explanation of why developers need to have a bit of slack, I suggest “Slack” by Tom DeMarco. I actually had to replace this book a couple of years ago because one of my bosses hung onto it.