This post is a slightly edited form of an e-mail that I sent around internally last year. But it was suggested to me recently that I post it up to my blog to see what people think – am I right or wrong?

Over the years I've come to the belief that there are two kinds of programmer in the world, no matter what technology they work with, lets call them:

        1. Day Programmers
        2. Night Programmers

Now - day programmers are the most prevalent in this industry, and you find them mostly in organisations which have historically tolerated a certain amount of inefficiency. Day programmers have the following characteristics:

        1. They are mostly led and seldom lead.
        2. The have trouble coping with complexity.
        3. They cannot visualise a solution.
        4. They don't load their development tools at home.
        5. Typically don't participate in the development community.
        6. See programming as "just a job".

If you are a night programmer, you probably have trouble understanding why a day programmer even entered the industry, and the reason is because they are motivated by different things than you are. The characteristics of a night programmer are:

        1. They mostly lead (or drag kicking and screaming).
        2. They develop deep understandings of complex things.
        3. They can visualise a solution and have a sixth sense around design.
        4. They load the alpha/ctp/beta version of tools at home.
        5. They participate in user groups and mailing lists.
        6. See programming is as vital to them as breathing air.

If you are a day programmer, you look at the night programmer and think that they don't have a life. And you laugh at them when they come in excited about some cool new trick they can do in the framework.