Software and complexity

Over the past few weeks, I have been conducting interviews for the position of a software developer. I must have conducted more than a score of interviews of people with about 1 to 4 years of experience in the industry. Many can’t answer what the size of an integer is or what the largest representable integer value with a given number of bits is. One person said he couldn’t recall the formula. Of those who get past that, not one person so far has been able to write a 10 line function with confidence. And this is after some initial filters applied by the HR agency that supplies us with resumes – a minimum salary and some development experience. These people have salaries in the range of 3 to 6 lacs. Somehow the industry is able to extract a commensurate amount of value from them.

The product that we develop has over 200,000 lines of code. How will someone who finds it difficult to write a 10 line function work on a codebase of this size? And yet, 200,000 lines of code would be classified as a small to medium project. There are so many software solutions that have millions of lines of code. Presumably these solutions are being maintained by people with the same levels of skills/abilities as the ones I have been interviewing.

The only way I can make sense of this is to hypothesize that the people who wrote those solutions with multi-million lines of code designed them to be maintained by people far below their own levels of ability. That is an aspect of programming that I have never paid sufficient attention to. I have always worried about how to make my code flexible in terms of the requirements it can support and scalable in the data it can handle. My consideration has always been how to minimize my effort when requirements change and load increases. Often this has meant an increase in complexity. I have never worried too much about it confident in amy ability to handle the complexity.

As I look to delegate more and more of my work, do I need to consider this additional factor – how do I write code that can be maintained by someone who barely knows programming? I am beginning to believe that the answer to that is yes.


5 Responses

  1. Honestly I can’t tell you (even being a programmer) what an integer’s size is in the .NET CLR, but that’s what Google is for 😉

    However, giving a problem to solve can be a good way to ascertain someone’s ability to tackle a problem. The test I took to get my current programming job, which lasted two hours I think (I re-checked my results for the last 15 minutes — unit testing my work, if you will), was actually more like an IQ test than a programming exam, and my opinion is that’s a good thing. Different people have different levels of particular knowledge, but what you can’t fake or quickly manufacture is the ability to think.

    The maintainability/complexity/ease conundrum is a tough one. No easy answer on that one, other than few people seem to appreciate rocket-science ingenuity if it’s difficult to maintain. I tend towards the ease side of the spectrum.

    Good luck with your search.

  2. In hiring software-developer, the starting point should be: what level of competence do I need in my context. What type of person would do an excellent job — not an average job, but an excellent job — while on feeling unchallenged.

    Once you know that answer, the next step is to know the market rate for such a person. Then, make sure you\’re willing to offer significantly over the market rate, on an on-going basis.

    That\’s the type of person you want for a job where that one guy will do better than two average people and better than four incompetents.

    The main reason things don;t work this way is because more senior managers do not understand software development.

  3. Thank you for your comments.

    I am trying to test the ability to think in face-to-face interviews and am following that up with a take home problem. Only 2 people have reached that stage so far and that is disappointing.

    Very good points.
    In the current context, I need someone who can understand the architecture of our existing solutions and add non-trivial functionality.
    I thought people who had a couple of years or more of development experience in one of the IT majors here would meet those requirements but it seems that is not the case.
    Someone must actually be writing code at these companies and I thought it would be the junior people who do so. Clearly the people I have been interviewing are not the ones to do so. So I am wondering who/where the actual programmers are.

  4. # do I need to consider this additional factor – how do I write code that can be maintained by someone who barely knows programming?
    Absolutely not. Why would you want to suffer idiots (not saying non-programmers are idiots; only that “programmers” who don’t know how to program ought not to be entertained)?

    Code should be such that a good developer who spends some time with it understands it (and the rationale behind it). Necessity-driven complexity and needless complexity are not the same.

    PS: I find this blog quite interesting.

  5. Yes you definitely need to write code with consideration to what kind of people you think will maintain it. As Martin Golding said “Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. Code for readability”

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: