views:

1540

answers:

23

My current company is starting a development project with another afiliated company. We are a programming shop but the other company has no developers.

We will be creating an app for that company but then the company will take it in charge so they want to have two developers of their own for this, to be involved in all stages of the development.

The story is a little bit long and complicated so there is no point in further detailing.

Bottom line: we have 10 candidate people from that company (most of them never touched a programming language) and we have to select 2 to become full time programmers.

How do we identify the best 2 persons? That's the question.

Is there a test that you can give to a random person taken from the street to see if they will make a decent programmer? What should we look for? Problem solving skills, logical tests, explain something to them and tell them to explain it back, make them learn a language then ask them to write stuff ?!?!?! What?

How would you procede? I searched for similar questions but could not find something to satisfy as an answer.

P.S. The language they will have to learn is Java (EE) and we have about 1 month to decide on the persons.

EDIT: I have to mention that we have a month to select them. The project starts in a while so they will have sufficient time to learn stuff. We won't just throw them head first into the project. They will work side by side with us (starting as junior programmers - from scratch) until the project is closed. Then they will pick it up and continue on their own. We need two juniors, but we need them from those 10 persons.

+53  A: 

Back in the 80s, IBM downsized a lot of its operations. At the time, they had a no-layoffs policy, so they moved the non-technical people being downsized into programming roles. The results were an unmitigated disaster. Your attempt to turn random people into programmers is likely to be another.

anon
I've seen complete disasters from programmers (CS studies + certificates + some experience... the stuff) and beautiful clean solutions from people who got in the business just to make more money. I'm looking for talent. Also, can't change the persons to select from.
user
+1. I agree, and I like the illustrative anecdote. This is like picking two people out of ten and telling them that they'll be expected to play first and second violin in an orchestra in 3 months. You might get lucky, but frankly, you won't. Tell the other company to at least hire a professional programmer contractor to handle this for them.
quixoto
@George Q: "How do I build a perpetual motion machine?" A: "You can't, don't waste time trying."
anon
But i got an offer from an indian outsourcing company yesterday and they promised me their programmers can deliver the perpetual motion machine just in time and budget.
Lothar
@Neil: "Really? I built a perpetual motion machine when I was 6 using bits of yarn and toothpicks I found around the house. It's not that hard." -George
bmoeskau
@bmoeskau I only had a sadly underpowered (totally lacking in torque), clockwork Meccano motor, and at the age of 9. It seems unfair that George got all those high-tech toothpicks and stuff.
anon
I thoroughly regret that George's comments seem to have been scrubbed from this question. I would have liked to have viewed the train wreck first-hand.
rtperson
A: 

It depends what level of programming experience they'll need. If they're just maintaining your code, they shouldn't need much knowledge. In which case taking a handful and teaching them basic Java and debugging shouldn't take too long. Pick the ones that take to it best and the job is done. However I'd recommend stressing that they still lack sufficient training and that the company would be better off hiring serious programmers before attempting anything ambitious.

Nick Udell
Why does maintenance not require much knowledge? Some of the hardest stuff I've ever done has been maintenance programming.
anon
Agreed.. you need to understand what the code is doing in order to maintain it, and for a lot of stuff, especially stuff involving complex concepts like the ones involved in J2EE, you need to have written some pretty similar code in order to understand it. And you really need to understand it in order to write proper edge cases, or to figure out if the tests are failing because the code broke or because the interface/requirements changed.
intuited
I've never had a problem myself but I can understand that this is highly subjective depending on a lot of factors, so the difficulty would depend entirely on the project itself.However I'd assume that during the training the concepts touched upon would be those faced in the code for the project itself, no point in giving bespoke training when you don't tailor it to the situation.
Nick Udell
+13  A: 

If none of them is a programmer yet or hasn't even done smaller projects on which you can trying to find out how motivated and talented a person is then the only solution is: fire two of them and hire two good programmers instead. It takes 5-10 years experience to became a good programmer anyway.

IMHO there is no simple test, i become more and more convinced that programming is a skill you can't learn, like people have or don't have musical skills.

But do an interview and find out who at least want to become a programmer, if they only want to do this to save their job you are screwed.

EDIT: And by the way even an already good programmer needs a lot of time to learn Java EE.

Lothar
We have a month to select them. The project starts in a while so they will have sufficient time to learn stuff. We won't just throw them head first into the project. They will work side by side with us until the project is closed, then they will pick it up.
user
@user: unless "in a while" is 2-5 years, and these two people have been dying to get into software development for a long time (and have shown aptitude), I can't help but agree with Lothar's advice to step outside the situation and find an alternate solution: let go two existing employees and rehire two developers; bring in a contractor; sell your client a multiyear support contract from your own firm. Any of these solutions is preferable to doing what it sounds like you're trying to do.
quixoto
+1  A: 

There are standard aptitude tests people take before they go to college and they try to point them in the right direction.

Google has 52,000 results for programmer aptitude test.

You can search and see if you find anything you like

Sruly
Wow, only 52 000 results to sift through.
intuited
I've seen and taken several of these. They gave neither consistent nor useful results. I tend to think of them as horoscopes for schoolchildren.
Ken
+4  A: 

Consider having a look at the Joel Guerrilla test: http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html because that is essentially what you need to do.

Also I've recently seen an article describing that the crucial point whether people can become good programmers, is if they can grok pointers and recursion. If they cannot even early, they never will. So emphasize particularly on that in your interviews, because you need to find those who can.

Also ensure that they actually write code while evaluating them.

Thorbjørn Ravn Andersen
+2  A: 

Pick the 2 people that most enjoy solving puzzles, like Sudoku.

You'll still have a disaster on your hands, but at least the 2 you picked will be most likely to take to programming.

Gilbert Le Blanc
I hate puzzles like Sudoku -- I've never met a programmer who did those. IME you'd do better asking who practices martial arts, or rock climbing, or even who got high last.
Ken
@Ken I do them occasionally, but I agree I don't think they are any sort of indicator of programming aptitude.
anon
Give them all free pizza and coke and take the two who eat in front of their monitor. They have the highest probability to become good programmers.
Lothar
Actually Sodoku is boring for many programmers since you _know_ there is a unique solution and it is just a lot of hassle to get there.
Thorbjørn Ravn Andersen
+1 for "You'll still have a disaster on your hands", but -2 for implying that *any* approach is even worth bothering with.
Rex M
Programmers don't do sudoku, or similiar games, since they just program a program that solves it for them.
Maister
Exactly, sudoku is totally in the realms of "why on earth don't you just knock out a script to do it for you". Likewise, I don't mind people asking me questions from crosswords, but when they go "A-something-something-R-someting-something-R I can't help thinking "how many such words can there be, just walk a DAWG filled from a dictionary, for goodness' sake.
Jon Hanna
@Lothar No, that will indicate the two most likely to have serious health problems. If you want programmers with brains, pick the two that avoid the heart attack pizza and diabetes juice.
emory
A: 

Your best problemsolver may be a mathematician completely uninterested hence unmotivated to make software. Check their motive and don't leave people on their own (avoid "mushroom management")

LarsOn
+3  A: 

Anyone who passes this test, Sun Certified Java Programmer, before they begin working side-by-side with your team, has proven that they can learn quickly and are fairly interested in the subject.

Having said that, the odds of finding such individuals in a random group of people are very low.

I beg to differ, you put an awful lot of faith in this Sun certificate.
R. Kettelerij
Actually, getting the SCJP is not very easy, and passing it *does* show that you know certain aspects of Java foundations well (its general usefulness has been discussed on SO a lot, e.g. http://stackoverflow.com/questions/81543/does-scjp-help). However, I'm not sure if it would be very useful in this scenario, as the certification is not an ideal way for complete beginners to *learn Java*!
Jonik
+10  A: 

Instead of filling Junior Developer positions, I would get these guys to be white-box testers. The last thing you want is these guys committing production code. If they are just writing unit tests, then they are less destructive. And, if they are decent, you might get something out of these tests. If you do this, I would get your applicants to try to black-box test a piece of code that has known bugs. The two that find the most will be the best testers. As for the programming responsibilities, I don't think there is anything you can do about it. I would just minimize the damages in order to humor your customer.

Eldila
Who tests the testers?
intuited
If they can write code in the form of working integration tests, (ex. driving the GUI with a program using for example webdriver, selenium), they will deliver value to your project, learn the features of the system, and not interfear with the production code.
Yeah, that was exactly what I was thinking hjo1620. The worst case scenario is that they are useless. And in that case, you throw out all the tests they made and use them as pre-beta testers. The only cost is the time they take away from other developers. However, that is unavoidable given the circumstance.
Eldila
This replaces "anyone can be a developer" with "anyone can be a tester" - neither are true, and good testers are if anything harder to find than developers.
anon
I didn't say that they would be good. Actually, they probably will be no better than a beta tester. But, they won't have the capacity of completely screwing up the product. The best option is not to have them at all. I don't think anyone disagrees with this. But what is the best option, given the circumstance. After saying that, the best option would be the one that minimizes the damages.
Eldila
I think you're onto something, but you've got it backwards. The experienced programmers should write some thorough test suites (assuming they haven't already), and the candidates should spend the month trying to write code that passes it. If they do it, they're in. Point them to resources and let em at it! If they haven't figured anything out after a week or so, you can pretty much assume that you'll need your coders to write that code. It's actually perfect: they get that glow of accomplishment when they pass new tests. You could even tag the tests with skill ratings.
intuited
If you really want them to not be anywhere near the code, have them write documentation.
Ken
+2  A: 

Wow, crazy situation.

You cannot test skills so all you have is aptitude and personality to go on.

I would personally give them some small project(s) to do. Something like you would see in the beginnings of a programming class. Offer to be a mentor and encourage them to ask questions.

Here is an example using Mono (C#) on Linux to get a feel for the kind of thing I mean:

http://www.tuxradar.com/hca

Keep track of their progress and questions, review their code, and interview them about how the process went from their point of view.

Any potential programmers will be hooked. You should be able to see their passion, creativity, curiosity, and maybe even some laziness in terms of a desire to streamline or automate or improve tooling.

Look out for anybody that finds the process tedious, wants to be spoon fed, is frustrated that the demands are too high or anything else that will bite you.

PS.

I realize that the Hudzilla exercises that I reference could be run on Windows as well. You would have to provide instructions to install MonoDevelop on Windows, provide it installed, or use a different IDE. Of course, another language may make more sense in your situation. This is just an example that I think any real potential programmer would be able to follow.

Justin
+5  A: 

Get them to set up a stackoverflow profile and then check what they post over the course of the month while you give them some progressively more realistic assignments.

You can be totally transparent about it, emphasizing that you want to see how well they can formulate questions (and/or answers..). It will also help take some of the training load off of your staff.

I'm assuming that for the kind of money you should be charging for this you can easily afford to pay them for those hours. After all, they're going to get tutoring from your staff, taking away lots of productive hours from your business.

intuited
+17  A: 

The truth is, might as well pick randomly.

When I've interviewed candidates for programming positions, we hire way less than 20% of candidates. That means even if your 10 people all had years of Java EE experience (as opposed to no programming experience at all), I still wouldn't want to pick 2 of them.

And even if you could pick the best candidates from any number of potential applicants, and all of the candidates had education and experience you were looking for, it still wouldn't help. The industry success rate for software projects ranges from (depending on who you ask) as high as 40% to well under 10%. So the project will probably fail regardless of what you do.

I think the situation today is like post-WWII test pilots. The technology was immature, so chances of failure were high. Test pilots were dying at the rate of one per week, but you didn't dare suggest that a pilot died because of bad luck, or aircraft malfunction, or anything like that. It was always a personal failure: he just wasn't good enough. The living pilots are still living because you're better.

I see a lot of programmers today acting the same way. You need to hire the best people, with years of experience showing they can ship products! They need top technical skills! (We can make them answer strange trivia questions, that make the Right Stuff's astronaut selection tests look downright normal.) If a project crashes and burns (as most do), it can only mean the programmer wasn't good enough. It wasn't mismanagement or shifting markets or some other external factor. Never is.

The answer, then, is to look at whatever stupid meaningless tests that Microsoft and Google and Apple give, and do the same kind of thing. The results will still be no better than random, but when the project fails and your bosses ask why, you can turn around and show them that you did the same thing that the top software companies do, so it was obviously the personal failure of the two programmers, not the process and certainly not you.

Ken
Somewhat cynical, but certainly makes sense...
Zsolt Török
I'm not sure if I was being straight up when I wrote that, or trying to be over-the-top. So I'm not sure if I'm satisfied or disturbed that it was upvoted to #2 after only a few hours. I'm certainly surprised!
Ken
The two new hires are not the only people on the programming team. So the failure of the project can't be pinpointed to one particular person. I agree that these "programmers" would be dead-weight, but projects have survived before with dead-weight. You just want to ensure that these "programmers" are ONLY dead-weight instead of actively destructive to your project. If the project failed because of these "programmers", it would be the managers fault. You knew that these two "programmers" could be destructive and you didn't structure the team in such a way to be resilient to this.
Eldila
Reminds of a book (http://www.amazon.com/Drunkards-Walk-Randomness-Rules-Lives/dp/0375424040 "The Drunkard's Walk: How Randomness Rules Our Lives")
Adrian M
+9  A: 

This is a WTF.

I say give the position to the guy who wants it the most. If A is very smart but doesn't care about programming, and B is mediocre but loves to have this opportunity to change his career, B is my choice.

irreputable
A: 

If there was a single reliable way to test what one should do for a living the world would be a better place and everyone would use that method by now. Yes yes I know there are many career tests but I haven't yet seen a single reliable one.

Your best bet would be to take a set of normal interview questions and pick the algorithmical ones and see who answers them best (like for example the google questions http://www.mytechinterviews.com/10-google-interview-questions). But even then you have 0% guarantee they will be into programming...

Zenzen
+5  A: 

What your project needs (and probably won't get) is a person who is both good at programming and understands the business.

Forget getting the person with the most programming aptitude. Get the person who understands whatever business you're in the best.

In the few weeks that you have, they're not going to be able to learn syntax, OO principles, standard libraries, and on top of that whatever you've written. I suspect the most you can expect of them is to be testers and novice tinkerers. So better to pick the guys who al least know what the product is meant to do.

This is how I started in programming. I wrote really bad code for years for various trading desks, and but it worked well because I understood the financial side. Then I gradually read more and more and adapted my programs with new knowledge learned from hours of reading about patterns, libraries etc. If you know the business, you'll know what tools will be useful.

Carlos
There is a lot of value in this answer. With the case listed in the question, this would be one of the better metrics. Truth is you can't really tell how well a non-programmer will program until he starts at it. Even then it takes years to be able to judge well. At least if he understands the problems to be solved he may be useful in some capacity.
Bill
A: 

Your experienced programmers should write some thorough test suites (assuming they haven't already), and the candidates should spend the month trying to write code that passes it. Maybe they're expected to do this in off-hours, to show that they are really eager to succeed. The test writers can tag the tests with difficulty levels, and maybe cross reference some of them to sections of a reference that have info on what they'll need to understand to write the code for that test.

This way, you avoid wasting a lot of effort, and you negate the risk of having inexperienced coders make sketchy contributions to the enterprise codebase. Assuming that you're writing unit tests anyway (which, under the circumstances, seems absolutely essential), the only extra effort you invest is in rating the difficulty of the tests and in adding links to reference material. Maybe you can use some of that later if you need to bring in or test additional dubious new hires. Theoretically you could open-source your code down the road a bit and get a book deal out of it.

It's great for the candidates, too: they can progress smoothly from easier to harder tasks, and they get that glow of accomplishment when they pass new tests, boosted by the feeling of making a genuine contribution to the codebase. Well, it's not so great for the ones that don't turn out to do so well, but at least they will have had the experience of it. Maybe they will decide to really dig in and learn more, or maybe they will be more content with whatever they were doing before this roller coaster came round.

For the sake of your financial department, it might be wise to stipulate in the contract that you can cancel it unless two of the candidates manage to pass a certain percentage of the tests. You might also need some way of ensuring that they are actually doing the work themselves, though this could apply in any such circumstance. I guess the threat of legal action functions as an effective deterrent against such strategies. Also it will be pretty easy to spot "plagiarism" due to obvious similarities between their commits.

Oh yes: you are hopefully using distributed revision control: git, hg, etc.? This way you can have them each make all their commits to a completely separate repo, and then just pull in the ones that are actually useful. svn has its uses, but serving as a shooting gallery for experimental firearms is not one of them.

intuited
A: 

I'll take your "specification" at face value and accept you cannot change it.

I'd go for someone with an aptitude for mathematics. Give them math tests until no one can correctly answer them. That is, find their level of incompetence.

One can only hope someone trained as an accountant would do better than a shipping clerk. At least from a probability stand-point it would seem just a tiny bit better than picking at random.

I read once that a common trait of good programmers is sustained concentration. Look for that as well.

But yes, all the disclaimers above do apply. Who knows in the end. Good Luck.

JustBoo
This assumes an aptitude for maths is associated with an aptitude for programming, something I don't think has ever been demonstrated. The only time I've had to take an aptitude test was for a programming job at a Big 6 accountancy firm - programmers had to pass the same tests the accountants did. I almost flunked the maths, but got 100% on visual/spatial, something no-one in the history of the firm had ever done before. Go figure. And I got the job.
anon
@Neil: If it's never been demonstrated then why during the nineteen-sixties and even up to today are math students directed into programming by many schools. Many of the same concepts apply, Set Theory, etc. Many terms in programming borrow from mathematics. I will not be drawn into a semantic gotcha' game. I stand by what I stated. INCLUDING the disclaimer, don't forget that. And that I talked in terms of probability.
JustBoo
A: 

This might seem like a joke but I am serious. Ask them about their childhood. Try to find out if they were the kind of kid that would try to "repair" broken household appliances. Or if they "repaired" things with their father. Or if they every wanted to just build something with their hands.

Maybe I can illustrate my approach better with an example:

I have a very good friend, who doesn't have allot to do with computers. But one time I went to his place and found out that he build a bookshelf for himself because he didn't find anything that fit his room. I could see that he was proud about it. He really had fun. IMHO he would make a good programmer.

Even if the person you are interviewing didn't actually build anything, the wish to do so is very important. You will be suprised how many people would never even imagine building something on their own.

Ofcourse this approach is very coarse, but it would eliminate allot of candidates in no time.

BernardMarx
+5  A: 

There was a small study done by Saeed Dehnadi, Richard Bornat on students on a programming course.

At the start of the course they subjected the students to a short aptitude test on assignment. After several weeks of lectures they gave them a programming test. They found a high correlation between students that had formed a consistent mental model of how assignment works (before being taught anything) and those that performed well in the programming test after some lessons.

The aptitude test consisted of 12 questions similar to this:

Read the following statements and tick the box next to the correct answer.

   int a = 10;
   int b = 20;

   a = b;

The new values of a and b are:

   [ ] a = 20 b = 0  
   [ ] a = 20 b = 20  
   [ ] a = 0  b = 10  
   [ ] a = 10 b = 10  
   [ ] a = 30 b = 20  
   [ ] a = 30 b = 0  
   [ ] a = 10 b = 30  
   [ ] a = 0  b = 30  
   [ ] a = 10 b = 20  
   [ ] a = 20 b = 10 

The full paper is definitely worth reading (It's only 20 pages). The full aptitude test and answer sheet can be found at the bottom of Saeed's homepage along with several other papers on similar topics. If you do use this, remember that you aren't actually looking for correct answers to the aptitude test but consistent answers.

The Answer sheet lists which answer maps to each possible mental model, and the Instructions on using the mark sheet explain how to mark to obtain a score for consistency.

Jeff has also written a blog about this paper

All that said, I fully agree with everyone else who has said using non-programmers as software developers is a disastrous idea. Even if this test can manage to successfully highlight some people in your group who have a natural aptitude for programming, software development is a discipline that takes years of practise to learn and decades to master (if ever). So go ahead, try this test, but unless it turns out that one of your guys goes home and spends 6 hours a night frantically coding open source software in his/her spare time my advice would be to keep non-developers off your dev team.

Simon P Stevens
Back in the 80s, when my company needed software developers, they gave a similar test to "unskilled" people working on the shop floor. Those people who got it right were given programming jobs and a 6 week training course on COBOL...
T Reddy
@TReddy: What was the outcome? Did they turn out to be any good?
Simon P Stevens
@Simon: I believe most of these developers stayed in IT until they retired...their programs pretty much ran the enterprise throughout the 80s and 90s...some of these programs still run today...
T Reddy
A: 

Give them a month to learn the programming language. Then get them to write a mathematics program (Using console or forms) that solves simply problems. When I got my first start in programming, I had to do a test to output the first XX prime numbers, work out factorials, do a "lastindexof" in a string (Without using the native function), and a bunch of other problems. It took me less than an hour to complete, and I got the job.

At the end of the day, if you really need to hire one of them. Algebra + basic programming skills is what you want.

Pyronaut
A: 

The approach put forward in this circumstance is very much flawed. If you turn the question around, and say, human resources are trying to find someone to fill a position who comes from a programming background, lets devise a test and see how they perform.

You are hte test candidate, and this is your approach.

Anyways, thats one point - the actual answer to your question is simple,

The people that should be chosen are the people with the most enthusiasm for the job and who can demonstrate why they want to take on the new job. Out of the 10 people some may want a career change, some may associate the programming with an eventual rise and so forth. These are the types of carrots that will most likely make these people better programmers.

Lets face fact, there are plenty of horrible programmers out there.

steve
A: 

Avoiding the meta-discussion horse - that's been flogged to death and beyond....

  1. Find the people who want to do the job and select...
  2. ...the people who were competent at algebra+ maths and select from them...
  3. ...the people who like taking things apart and learning how things work.

Those 3 indicators cover probably 80% of programmers.

Paul Nathan