Andrew Stopford's Weblog

poobah

News

Articles

Family

Old Blogs

Great programmers do not make great software engineers

A post Jeff Atwood started has had some comments from Phil, Ayende, and Jeff. All bring there own interesting views to Jeffs post, I have my own views on this.

In our world you have two kinds of people, programmers and software engineers. I don't believe in such a thing as a good programmer or a bad programmer because everyone judges in different ways and it its very big headed of them to consider another programmer when I am sure they have failings of their own. Such behaviour effects moral, team work and a persons confidence and achieves nothing. Those programmers that consider them selfs 'great and good' and can code amazing algos in 3 seconds can fail at code design and testing, while others can take a little longer but achieve good design, consideration of patterns and testability. Everyone is different and its more about where you want both your self (and prehaps your team) to be with out making it a witchhunt.

Every single programmer should aim to be a software engineer, write great code but consider everyone else, they can design their code in a paper or tdd way, they can test there code and consider testability in their code, they undertstand concepts like patterms and they can consider patterns in their code to help improve their code. These are just a few things but doing we do is much more than bashing the keyboard, even great programmers can churn out plates of pasta with no thought or consideration of anyone else coming to the code. A key example, in my own experince a fraction of programmers (a very small fraction) know how to unit test, a even smaller fraction know what TDD is let alone use it and even smaller fraction still know about BDD. Even so called great programmers do not write unit tests yet programmers who some may consider not so great do, I know who gets the vote there.

I don't believe in stupid interview questions or tests, while they are suppose to give you an idea of persons ability they can very quickly turn into a wits contest and do not reflect on a person at all. Every person is different, some may succeed at these sorts of questions at interview level and some may not. Does that make them a bad programmer, no it just means they need to carefully consider what they are doing. Prehaps rather than asking them to code something (and again everyone approaches a problem in a different way) ask them how they would approach a problem, what steps they would take and where they have used that approach before. It's all about attitude, for any given persons CV you can see if they go the extra miles in their spare time and career. Phil has posted before about a persons involvement in OSS as an indicator and for me it means that a person is willing to work to a given rule set (most OSS projects impose rules) and goes the extra mile.

Let's also not pick on grads, every single grad I have worked with have been open minded, hard working and who are willing to push them selfs to be better and most important of all aim to be software engineers. On MbUnit we were lucky to have Ben Hall join us over his summer break, Ben asked how to muck in with the project and through his hard work is now a core member of the team. I can think of other grads with the same mind set such as Mono's César Natarén and Ben Maurer who have worked hard on Mono and who's ability is with out question.

Comments

Thom said:

Did you actually look at the problem the candidates were struggling to solve?

# February 28, 2007 9:22 AM

AC said:

Thom: Your point is valid and important, but I think Andrew is talking about something else.

I am also troubled at the lack of imagination and open mind among the current crop of programmers.  

I classify software professionals as Geek/Hacker -> Programmer -> Developer -> Architect.  Unfortunately 99% of software professionals are at the geek level.

Great post Andew, Got to go...

# February 28, 2007 11:23 AM

Robert said:

A few years ago we set a programing problem as part of an interview. It was fairly simple: print the first 1000 primes. People had as much time as they liked and could do it in whatever language they wanted. Of the 10 that did it (all well qualified):

1 person managed it (Well nearly)

1 person ran off

1 person wrote a program to print the first 1000 integers (via a label!)

7 people simply failed

We took on the person that managed it and it turned out to be an excellent decsion.  Interestingly my wife (who is a housewife) managed a perfect implimentation in pseudocode in about five minutes...

# February 28, 2007 11:51 AM

The Other Steve said:

"A few years ago we set a programing problem as part of an interview. It was fairly simple: print the first 1000 primes. People had as much time as they liked and could do it in whatever language they wanted. Of the 10 that did it (all well qualified):"

See now that one would hang me up, as the easiest way is just a bunch of loops where you keep trying to divide and check the remainder.

But I wouldn't do that.  I get caught up trying to remember how to do a Sieve of Eratosthenes, and without a reference text I'd most assuredly get it wrong.

It's like asking someone to write an algorithm to sort an array.  Most people know how to do a bubble sort, but that's not the most efficient way, and the real question is why are you wasting your time writing a sort when it's an API call?

The key to wisdom is not having memorized things, but knowing where to look them up when needed.

# February 28, 2007 3:22 PM

Atul said:

If only you could get a qualification on your ability to use Google :-)

That would probably cover about 50% of the job alone!

# March 1, 2007 7:33 AM

LayBlob said:

The fraction that does use TDD is as productive as pulling in an entire stack of VM bloats, BEA/ASP.NET bloats, and then some JMS/WCF bloats and whatever tools and editors are required bloats and then some more xDoc bloats and wow they got a web-page and one class.

Same for .NET, same for a lot of disciplines and environments.

The best coders you will ever come across are not the ones familiar with TDD for sure, take that for granted. Reason is very simple. They will take equivalent amount of time to reach the destination (quality design), whilst the TDD guys will live in SD and SSADM and formal methods, and hierarchies and what not, ONLY to prove 'no absence of bugs'. Those that follow patterns blindly produce most conventional, simplistic and very inefficient code.

One example that does stand out are people writing client code first, and being a superset of TDD it is an art in prototyping and it is certainly not as restricteve. But why bother, look at that reply above and you see how the industry is pushing everyone one to call themselves an Architect (ops ego-lego), Developer (watch out of those as they are the ones that can be neglected in the story) and Geeks/Hackers.

So it is not unusual to come across Geeks and Hackers out there that simply dwarf the Architects of runtime and other worlds, plenty of examples on the web, look at the 1999/2000 age and technologies around that timeframe. Their code is not documented, their code has no unit tests, but it speaks volumes. Look deep and you will find examples how an 'geek artist' can be a great developer, better architect than all runtime wannabies ever will be, and certainly a great software engineer. Some of them ended up in top positions making software for Architects to blindly follow.

Just my 10 cents.. I wouldn't classify anything or anyone, especially developers because they are one and all :)

# March 1, 2007 8:13 AM

Andy Stopford said:

Thanks for the comment. It's interesting to see your viewpoint on developers and the use of patterns and approaches like TDD, it speaks volumes.

Why would a great developer be one that does'nt use these things? Every developer makes mistakes, has bugs, every single one with out exception (including the good ones). Code can pass hands or sit still for a few months/years. In both cases modification with out a safety net is like having a shark as a swim buddy. Even good developers forget, and if they blindly start changing things with out knowing what the change might effect then they may as well eat beans and wear spurs. I finish up on TDD that your understanding of it is such that I've never seen SSADM featured in TDD, if I were you I'd follow Atuls suggestion.

Following anything blindy is crazy, on that we agree. Not following a script of any way shape of form is one sure way of cooking up the biggest plate of pasta mud to ever grace this planet. Using patterns as a way of explaining concepts to others and cleaning your design and your code is the right way to be using them. Most folks that use patterns also have common sense.

# March 1, 2007 9:58 AM

Ayende Rahien said:

@Andrew,

Did you see the questions? They weren't "how many people live in seatle" type of questions.

They are "does he even know what he is talking about?"

If you can't reverse a string, you aren't a programmer, period.

# March 1, 2007 12:46 PM

andrewstopford said:

Ayende, thanks for the comment. I suspect that in a true interview if you can find out what work a candidiate has before, on what and how then you do need to ask him these kinds of questions. My point here is not " how to draft interview questions 101" but that no programmer should be considered on their ability to answer programming questions alone yet this whole debate centers around that very fact.

# March 2, 2007 4:12 AM

Ayende Rahien said:

I see this as a lacmus(sp?) test.

If I give someone visual studio, access to google and ten to twenty minutes, and they still can't solve the problem, that means that I just saved an hour of my time.

I should point out that this is something that is really only relevant for people that I didn't get from friends. If I got someone that was referred, I can assume that he is a competent programmer and move to discover if he is a good match for us.

If it is just random stranger, I need to establish that he knows one of of the compiler from the other.

# March 2, 2007 7:30 AM

Tony said:

> no programmer should be considered on their ability to answer programming questions alone

I agree with Ayende on this one. Certainly, people shouldn't be judged only on their ability to answer programming questions, but, hey, we're not talking rocket science here. Candidates that can't make a decent fist of the type of questions discussed (not necessarily a complete solution, but an indication that they know how to approach it) don't know the basics of their craft. This isn't a "wits contest" - this is about finding out the non-starters at the first hurdle and not wasting any more time on them.

In mathematical terms, the questions aren't a sufficient condition, but they are a necessary one.

# March 3, 2007 3:44 PM

andrewstopford said:

Hi,

Thanks for all the comments. It's great to have some views on this but I'll try and put this one to bed so I can blog about other things :)

First off I agree with everyone here that programming questions, in terms of judging how to approach and a resolve a problem should be included in an interview. The questions being asked were not vastly tricky of that we all agree.

However, the buck should not stop there and what folks should be focusing on is that if a candidate shows willing and you can round off with SE questions then you get a bigger picture.

# March 5, 2007 4:10 AM

Jerrad Anderson said:

# March 5, 2007 11:26 AM

Development and Integrity Management by Eli Lopian » Create Exceptional Developers said:

Pingback from  Development and Integrity Management by Eli Lopian » Create Exceptional Developers

# May 5, 2009 2:26 AM
Leave a Comment

(required) 

(required) 

(optional)

(required)