30

Original Question

I already did some interviews for my company, mostly computer scientists for dev positions but also some testers and project managers. Now I have to fill a vacancy in our research group within the R&D department (side note: “research” means that we try to solve problems in our professional domain/market niche using software in research projects together with universities, other companies, research centres and end user organisations. It’s not computer science research; we’re not going to solve the P=NP problem).

Now we invited a guy holding an MSc in chemistry (with a lot of physics in his CV, too), who never had any computer science lesson. I already talked with him about half an hour at a local university’s career days and there’s no doubt the guy is smart. Also his marks are excellent and he graduated with distinction. For his BSc he needed to teach himself programming in Mathematica and told me believably that he liked programming a lot. Also he solved some physical chemistry problem that I probably don’t understand using his own software, implemented in Mathematica, for his MSc thesis. It includes a GUI and a notable size of 8,000 LoC. He seems to be very attracted by what we’re doing in our research group and to be honest it’s quite difficult for an SME like us to get good people. I also am very interested in hiring him since he could assist me in writing project proposals, reports, doing presentations and so on. He would probably fit to our team, too.

The only question left is: How can I check if he will get the programming skills he needs to do software implementation in our projects since this will be a significant part of the job?

Of course I will ask him what it is, that is fascinating him about programming. I’ll also ask how he proceeded to write his natural science software and how he structured it. I’ll ask about how he managed to obtain the skills and information about software development he needed. But is there something more I could ask? Something more concrete perhaps? Should I ask him to explain his Mathematica solution?

To be clear: I’m not looking for knowledge in a particular language or technology stack. We’re a .NET shop in product development but I want to have a free choice for our research projects. So I’m interested in the meta-competence being able to learn whatever is actually needed.

I hope this question is answerable and not open-ended since I really like to know if there is a default way to check for the ability to get further programming skills on the job. If something is not clear to you please give me some comments and let me improve my question.

Update to reflect the answers given until 2011-12-01

What answer I accepted and why

Thank you all for your answers, most of them are quite helpful, so I upvoted a lot! Although Tom Squires' answer got the most votes, I'm going to accept the answer given by Prince Goulash. Of course Tom is objectively correct, but Prince's answer is just more helpful for me and I double-checked the FAQ that this is the criterion to accept an answer.

What I am going to ask him during the interview

  • I'll let him explain some simple assignments like the example in The Camel Has Two Humps mentioned by Chris Burt-Brown

  • I'll ask him to explain some more advanced control flows maybe in a graphical notation.

  • I'll check his understanding of recursion using a math example.

  • I'll let him explain an algorithm of his choice in natural language.

  • I'll let him explain his Mathematica solution, in particular I'll ask for his procedure model, usage of tools, structuring of code and software in general as well as different abstraction layers.

  • To check his motivation I will ask for his software development fascination.

  • I'll ask him if he is aware of what he will need to learn about enterprise software development. Especially I want to turn the discussion into the direction of working in teams, pair programming, TDD since I expect him not to know a lot about this after working on his MSc alone.

Sounds like it's going to be a long interview ;)

Update after the interview 2011-12-09

Again thank you all for your good answers. He passed the interview with flying colours. I never was more satisfied with an applicant. His Mathematica solution seems to be structured quite well. He was able to explain where he used higher-order functions, although he didn't know that these are referred like this. He answered my math-based recursion questions as well as simple assignments and control flow things from The Camel Has Two Humps. When he was explaining some algorithms I learned a lot about non-linear fitting ;) Also he honestly said that of course he can't guarantee that he will be able to learn things about professional software development that he doesn't know so far. But he believably statet that he was always good in learning new concepts -- even by himself -- and is really interested in software development. He also asked for the technology stack of the project, he would be applied to first, to have a look at it at home. He was curious about pair programming and team work, too. Now I hope that the employment contract will be concluded.

Silas
  • 403
  • 3
  • 8
  • 9
    I find it wonderful that companies are willing to hire people with no knowledge in the technology they use. I wish I found your company before I did what I did to my career! – NoChance Nov 28 '11 at 09:31
  • Emmad: That's what I tried to explain and meant with "meta-competence". Where's my company's benefit when I now hire an excellent C# programmer who is not able (or willing) to learn Scala/Lift when needed? And to be honest: Actually it's quite difficult to get good people in Germany. Especially when you're an SME not being located in a trendy metropolis like we are. – Silas Nov 28 '11 at 09:42
  • 2
    Ask him to do a little research on simple control flow, and other very basic techniques in a specific language. Then when he comes in ask him to solve a problem using those. – Darren Young Nov 28 '11 at 10:28
  • @Silas: Thanks for your feedback, your point is clear. – NoChance Nov 28 '11 at 12:58
  • 2
    I've worked with a few scientists-turned-developers in my current position. IMHO they tend to be very good at the problem solving aspect of development and not so great at writing maintainable code with good OO principles. If you want him to do more than write 'quick and dirty' tools you may need to have a traditional developer working with him. – Jordan Bentley Nov 28 '11 at 14:50
  • The best developer on the team I worked on first out of college had an electrical engineering degree and his only coursework in programming was a course called "Fortran for engineers". He led development on a natural language parsing product, wrote code that produced object files, fixed bugs in 3rd party software for which we did not have the source code and other hair-raising feats. Haven't met another developer quite like him since... incidentally he left that job to form his own company :) – JoelFan Nov 28 '11 at 16:57
  • 2
    I pretty much AM this guy. I have a computational physics/chemistry background, and I have developed a lot of computational models/code, along with a number of (sometimes complex and successful) side projects. The main adjustments I had to make in a professional development environment had to do with development methodology and working in a team. Make sure he understands what it takes to work together on software. Make sure he understands the methods you guys use (TTD/contubuous integration that kind of stuff) and what working with them means for his output. – drxzcl Nov 28 '11 at 21:48
  • Also, make sure he has basic programming skills. It's surprising how far you can get in computational science by cargo-culting everything except a few formulas. FizzBuzz should sort those guys out. – drxzcl Nov 28 '11 at 21:50
  • @Silas So how did the interview go? – Sign Dec 08 '11 at 16:00
  • Sign: I'll update my question with the answer. – Silas Dec 09 '11 at 07:43

14 Answers14

37

How can I check if he will get the programming skills he needs

You can't. It's impossible to accurately test for a skill he doesn't have yet. You have to make a judgment call based on his intelligence and attitude. It's ultimately always going to be a risk.

From personal experience I can say it's very possible to transition from science to programming. They both basically boil down to using your brain to solve complex puzzles.

Joachim Sauer
  • 10,956
  • 3
  • 52
  • 45
Tom Squires
  • 17,695
  • 11
  • 67
  • 88
  • 8
    +1 For "They both basically boil down to using your brain to solve complex puzzles." – joshin4colours Nov 28 '11 at 15:16
  • 1
    What's the matter with you? Hire the guy, for heaven's sake! Remember that programmers are merely high-tech lathe operators. He's enthusiastic, smart, and knows a lot of chemistry. If you *don't* hire him then, next time you go to hire somebody a year from now you'll be kicking your ass that you didn't. – Pete Wilson Nov 28 '11 at 17:21
  • 1
    It's not rare that a CS graduate may have been programming since they were 13 years old or so. By the time they enter college, they are already an intermediate programmer by most scales. That doesn't mean that they didn't learn anything from their degrees. Programming is easy... Computer Science/Soft Engineering is not. This doesn't they won't be able to contribute and be a valuable member... But it does mean they will probably never have the same CS foundation. – user606723 Nov 28 '11 at 20:28
21

I am very biassed here because I started as a software developer a few years ago with a PhD in physics, but very little coding experience (amounting to an undergraduate course on Fortran). Clearly it depends on the type of software you are developing, but my view is that coding skills are very easy to pick up by anyone with half-decent scientific/problem-solving skills. I don't intend that as an insult to life-long programmers who have studied computer science: of course there are technical aspects that take serious training in order to master (e.g. multi-threading and very low-level architecture) but I assume that's not the position you are trying to fill.

For my technical interview for my current position, I was faced with a reasonably complex mathematical problem and asked to design a program to solve it. The emphasis was on writing an algorithm that, once implemented, would solve the problem. I could write an answer purely using words to describe my solution, but I was allowed to write some code in a language of my choice if I so wished. The test was more about problem-solving ability and whether I was able to "think like a programmer". Obviously if there were candidates of equal ability and one had more direct coding experience, then he would have come out on top, but that seems fair enough to me.

The bottom line is: examine the candidate for the skills you are hiring him for, not for ideals that you hope he will achieve.

Prince Goulash
  • 326
  • 1
  • 5
  • 2
    Having worked with programmers that were former scientists, it's not just low-level details that they're ignorant of, but also the very high-level things. YMMV of course, but it's a general lack of depth that's the issue. Not that all jobs need that… – Donal Fellows Nov 28 '11 at 10:49
  • 1
    @DonalFellows: I don't doubt that developers withuot specific training can lack both breadth and depth of knowledge. It depends on the role, and on the amount of in-house training that is being offered. – Prince Goulash Nov 28 '11 at 11:16
  • 1
    @DonalFellows: given that the OP is interested in determining the applicant's ability to learn, not his present knowledge... –  Nov 28 '11 at 11:19
  • I think you're misreading me slightly. They're not just unaware of the many levels of (leaky) abstractions, but they're unaware that this hurts their ability to program. I'm also not just talking about people who have just switched, but also people who have been coding for years; they know their own patch very well, but make odd and simple errors outside it. Basically, I think that designing something well takes good knowledge _across lots of levels at once_, and that requires both deep and broad understanding. (Moreover, some people just aren't good at creating abstractions at all.) – Donal Fellows Nov 28 '11 at 11:41
  • In fact my question was not related to his current knowledge. Donal, could you go a bit more into detail? I would have expected that natural scientists have a decent understanding of synergetics in general so it should not matter if the system is some chemical reaction, a community or a software system. Why are the people you know unaware of abstraction? Of course they need to get access to the information they need (about architectural patterns for example). – Silas Nov 28 '11 at 13:03
  • @Silas, I think Donal may have been refering to this: http://www.joelonsoftware.com/articles/LeakyAbstractions.html , rather than abstraction in general. –  Nov 28 '11 at 15:33
  • 2
    @DonalFellows: as I said before, given that the OP is interested in determining the applicant's **ability to learn, not his present knowledge**... –  Nov 28 '11 at 15:36
  • @DonalFellows: Don't overgeneralize. You don't have enough data to assert that all former scientists are bad programmers. There are plenty of programmers with math/science backgrounds who do better than plenty of people with CS degrees. The OP is just trying to determine whether the candidate is one of those, or one of the ones you've worked with. – Cascabel Nov 28 '11 at 16:44
  • It's no insult! I'm a life-long programmer and you're perfectly correct: programming is just a skill one learns by practice, like hammering nail properly or making love. – Pete Wilson Nov 28 '11 at 17:59
  • 2
    @Mark Bannister: A good scientist can learn, that's not a useful question here. A more useful question would be if the scientist will learn what he or she needs to know. That's more of a personality issue. Does the scientist know what he or she doesn't know about software engineering? – David Thornley Nov 28 '11 at 18:16
  • @David `Does the scientist know what he or she doesn't know about software engineering?` Thanks for this question! Probably not, but I'll try to figure out during the interview. Thanks again. – Silas Nov 29 '11 at 07:38
  • @Mark Thanks for the link to Joel's blog article. He summarized a well-known problem in a nice way. But I don’t think that this is a topic that’s harder to understand when you don’t have a CS background as Donal might have meant (?). – Silas Nov 29 '11 at 09:00
6

I don't have any secondary sources verifying this paper so I can't vouch for it but:

The Camel Has Two Humps
http://www.eis.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf

We have found a test for programming aptitude, of which we give details. We can predict success or failure even before students have had any contact with any programming language with very high accuracy, and by testing with the same instrument after a few weeks of exposure, with extreme accuracy.

  • 3
    After having read the paper I believe to remember that I’ve read more about this study a while ago. Just can’t find it again :( Edit: it was [mentioned at Coding Horror](http://www.codinghorror.com/blog/2006/07/separating-programming-sheep-from-non-programming-goats.html), thanks for the reminder – Silas Nov 28 '11 at 13:41
  • You beat me to it, I was about to answer with the Coding Horror link @Silas added – Izkata Nov 28 '11 at 14:58
5

How can I check if he will get the programming skills he needs?

It's very simple. Give him the skills.

Now, that's not a very satisfying answer, but let me elaborate.

I came to programming after doing 3 years in Civil Engineering. That's a pretty solid background in applied physics and mathematics. It's not the theoretical math that a CS degree would give, but it's worth something. What I drew from the engineering experience was a solid background in problem solving. Anyone with a math background already appreciates the concept of elegance when talking about a solution to a problem. They've already got an education in refactoring since they've spent the time taking six pages of chicken scratch and converting it into an elegant half page proof for submission.

Anyone who's studied physics has developed an intuitive approach to cobbling together a solution from basic frameworks.

And what is programming outside of these skills? -- Language, Idiom, Patterns and Frameworks. These are easy to teach. It's problem solving that you can't. If you are able to provide instruction in these areas, then you'll end up with a good developer.

The question then becomes "How long can you wait for him to get up to speed?"

tl;dr; You can teach typing. You can't teach smart.

Chris Cudmore
  • 553
  • 4
  • 13
  • +1, Very nice answer. I wish people had more open views about professions: having a math degree doesn't mean you can't do programming for a living, nor does it the other way around. *Learning to learn* is the important skill IMO. – K.Steff Jun 03 '12 at 03:54
2

I have a BSc in Material Science but have worked all my career in software development.

I would suggest that your candidate will probably not have problems with the basic programming and algorithms, but when it comes to the more "engineering" type requirements he may need some guidance. By that I mean structuring his code well, not having 500 line functions, testing effectively, designing for efficiency...

Most of this can be taught, but you may want to design some questions to chekc this out.

Jaydee
  • 2,667
  • 1
  • 18
  • 17
2

Also he solved some physical chemistry problem that I probably don’t understand using his own software, implemented in Mathematica, for his MSc thesis. It includes a GUI and a notable size of 8,000 LoC.

Sounds to me like the candidate already knows how to program, granted they might not have as much experience doing it as a dedicated developer but they have a demonstrable project that they have completed that required a non-trivial amount of work to be completed. As such, you might be able to interview the candidate the same way that you would a developer who uses a different language than the one you shop uses, namely:

  • Core Competencies - Does the candidate understand basic programmatic logic, flow control, basic data structures.
  • Advanced Competencies - Does the candidate understand object oriented programming and design, advanced data structures, interfaces, abstract classes, etc.
  • Problem Solving Skills - Given a problem, does the candidate demonstrate solid problem solving skills.

The language that Mathematica uses is fairly advanced and someone that is good at writing software for Mathematica should be fairly competent in other realms so focusing on that experience and using that as a basis for coding experience could be a good way to approach the interview.

rjzii
  • 11,274
  • 6
  • 46
  • 71
2

Speaking as an Aerospace Engineering graduate turned programmer, it is certainly possible to make the leap from the natural sciences to programming. However, be warned, being able to solve problems does not always correlate with the ability to write code. You seem to realize this and that is a good thing.

To me, the most important concepts to make sure he grasps are control flow and recursion (and looping in general as a subset of this). Before hiring a candidate, even somebody who is clearly very intelligent be sure he can write out a plain words algorithm to solve problems. Make sure he can take that plain words algorithm and turn it at least into pseudo-code. You may even probe to see if he can at least understand the concept of polymorphism, though I'm not sure this is requisite knowledge in this circumstance.

Also beware the ability to solve science problems in Mathematica/MatLab/Whatever does not mean he can write good code. It merely means he is able to apply basic (sometimes extremely basic) programming principles, usually if/else statements. Learning to be a good programmer will generally take both a personal and employer commitment to somebody at this stage. Warning: I've met very intelligent people who were/are good engineers that couldn't program their way out of a paper bag and honestly could not grasp basic language fundamentals.

Personal Experience

I graduated from school with an engineering degree and a little bit of programming experience under my belt. I had worked with a very small amount of C, quite a bit of MatLab and some VB + Access. It took me about 3 months of studying to become truly useful as a programmer in a VB.NET shop. It took me another 9 months to become fully proficient. However, I can, with a fair degree of confidence say that my problem solving skills are superior to 99% of other programmers I have met in my job. My employers have consistently considered me one of their more valuable assets.

Conclusion

It's a risk/reward proposition but often times taking on somebody who has the pure problem solving skills can pay off in the long run as long as they are capable of learning the programming concepts and you are both willing to invest the time in expanding his programming knowledge. However, I firmly believe that he must posses at least a basic understanding of the fundamentals of programming before you offer him a job. In my experience, once you're at this point, you can go much further with it.

Mike Cellini
  • 1,865
  • 10
  • 19
  • Thanks for your reply. It confirms most of my thoughts. I just want to add that I've met a lot of computer scientists, working as developers and architects for years, who IMO are not able to write good code, too. Even some of those who write technical articles about programming. Bottom line: Beeing a good progammer _always_ requires you to read a lot of books, learn different languages and so on... no matter what kind of degree you own. – Silas Nov 29 '11 at 08:27
1

I would start with some basic algorithm questions and basics to see if he is into the logic of algorithms and programming. If he is capable of understand what an algorithm is, he can eventually develop the skills needed to do concrete things afterwards.

LostMohican
  • 715
  • 1
  • 6
  • 10
1

How can I check if he will get the programming skills he needs to do software implementation in our projects since this will be a significant part of the job

Honestly, I am pretty sure you won't get this information out of a one-or-two hour interview. Give him a programming assignment in C# (something not too technical) and one or two weeks to solve. That should be enough time to learn the basics of the language for someone who has already learned programming with Mathematica. Then make a code review with him and decide on that base.

Doc Brown
  • 199,015
  • 33
  • 367
  • 565
1

You might look at Practices for programming in a scientific environment? (on Stack Overflow) to get some idea of what the programming culture of the natural sciences looks like. That way you're in a position to compare his preparation to that of his peers.

For that matter, you might ask him to describe the programming practices he's used to in order to learn if he is aware that there are other ways to do it.

There are a lot of "good programmers" in my business whose qualification is being able to hold enough state in their head to cobble together some working code, but whose work tends to be un-structured and hard to maintain. Generally they can be taught, but...they have to be taught.

0

Another department where I work uses a variation on our standard test. The first task is to reverse the words in a string in place. Then, use that code to reverse the order of words in the string, still in place. Instead of using a programming language, they have the candidate design the algorithms on paper and run them using a Scrabble board.

0

I would ask to describe (using natural language) an algorithm for calculating something from physics. Something a bit more complicated that a simple formula and then I would ask how would he see his calculation encapsulated in objects (no need for OOP knowledge, you could explain what is your expectation of an object). In this way you can see his logical thinking. This is more important than any programming skills.

alinoz
  • 101
  • 2
0

First, they are probably quite smart, so worst case scenario they can learn to be a good programmer with guidance. However, if you need them to jump in and be a decent programmer from the get-go, have them send in some sample code that they've wrote.

Is it one or two giant multi-purpose functions or did they encapsulate functionality at the appropriate levels of abstraction? Are magic-numbers hard-coded throughout? Is the code DRY? Did they give variables reasonable names or is everything an undecipherable abbreviation or single letter variable? Can you mostly follow the logic of their code? Do they understand OO basics?

Ask what they use for version control (git/hg/svn/cvs/bzr, etc.). Have they ever profiled code or used a debugger, and if so which ones or what's their generic debugging strategy?

If they fail this test and you need a good coder from the get-go, skip this person. Otherwise, hire them, suggest they read some software engineering books (e.g., Code Complete) in addition to generic programming/CS books.

(For the record I'm also physical scientist turned programmer.)

dr jimbob
  • 2,071
  • 1
  • 15
  • 17
-3

Since he is still in a university or only recently finished, he is used to study. Get him to read and understand Design Patterns book and after (or during) a month, have a thorough discussions with him on the topics. (I think that) this can tell you a lot about his abilities (not only hard ones (those too), but also how he handles grasping new concepts, understanding their use, seeing pros and cons etc.). But it'll cost you one month of time.

herby
  • 2,734
  • 1
  • 18
  • 25