Fog Creek Software
Discussion Board

What must the great programmer know?

Management only goes so far.  But strong management skills need strong programmers to manage.  What do you think that a passionate programmer should know?

I think there are at least two things:  computational theory and algorithms.  I don't think knowing these two makes an incredible coder, but I think incredible coders know them.  I had only been studying computation a couple of weeks while holding down a full-time job, but already I feel an order of magnitude better.  After learning to speak the language of tuples and graphs, my APIs are clearer; less complicated.  Or at the very least, it takes me less time to come up with them and know their soundness.

Whereas knowing algorithms keeps me aware of how to implement these designs, keeping my performance-devouring tendencies in check. ;-)

Richard J.
Saturday, March 16, 2002

I disagree; understanding algorithms is often of secondary importance. The goal of any programming project is the development of solid bug-free code that satisfies the customer's requirements and is maintainable for future changes.

Performance is just one portion of that goal, and is only relevant in the portion of the code that forms a bottleneck. Also, at least in the performance tuning that I've been involved with, sophisticated algorithms play a minor roll. Instead, I've focused on minimizing how often the code performs expensive operations, such as accessing a database or allocating memory.

Still, I'm not sure how to answer the initial question. Outstanding programmers have a general ability and way of thinking that involves a lot more than a particular knowledge base. Of course, additional knowledge and experience make one a better programmer.

Jared Levy
Saturday, March 16, 2002


Computational theory sounds good.  Where do I go?

Ged Byrne
Saturday, March 16, 2002

The only great programmer is one who is appreciated by her team and management for her contribution.

Stories of miracle working by programmers are often signs of poor management, not great programming.

James Wann
Saturday, March 16, 2002

Most software development is easy.

Great programmers only worry about the hard bits if they exist firstly, and secondly work it out generally from first principles. Knowing and algorithm is 'handy' but little more.

Ever noticed that the terms 'Research' and 'Development' often go hand in hand. Good developers are good researchers to.

Sunday, March 17, 2002

Ged, here is a link.  It is a sweet little book, and if you're not disposed to liking it anyway, the comments have other suggestions.

Tony, I think that good software dev *can* be easy.  But I really want to talk about orders-of-magnitude improvements in programming ability.  To be an amateur poet, it is like solving a nice maze, only to find out later you're in another one.  Somewhere it ends, but few know where.

I don't think knowledge of algorithms makes an incredible programmer, but incredible programmers know them.  At least intuitively.  Because part of the job is inevitably optimizing.  I think I would also add knowing security to the list.  If only because it implies a deeper understanding of data.

Richard J.
Sunday, March 17, 2002


This books looks interesting.  I had heard of the computation theory when reading about Turing, but only as an historical reference.

For some reason the book is much cheaper in the UK.  Makes a nice change. 

I think I'll make it my next book once Code Complete is finished.

Ged Byrne
Sunday, March 17, 2002

Richard, you say, "But I really want to talk about orders-of-magnitude improvements in programming ability"

My point is that algorithm and computational theory knowledge do not map in any way to an order of magnitude improvement in programming ability. How does one define programming ability anyway, I may be able to write slick, tight functions but may be hopelessly inadaquate at developing a complete system, or vice versa.

If you have a head full of computational theory and algorithm knowledge then all you have is an ability to memorise. Good developers, work out what needs to be done and research the best solution, that may or may not mean discovering an algorithm, maybe for the 2nd or 3rd time in a career.
Everybody knows not to re-invent the wheel.

Sunday, March 17, 2002

What every great programmer knows:

1. how to read other's code (which is usually more like playing a massive game of concentration than reading a book)

2. how to instinctively refactor their own code to make it more generally useful, more readable, more concise

3. how to sit down and *STUDY* a computer book or manual, straight through, for its own sake

4. how to use a debugger and a profiler

5. when to give up for the day and go home

Timothy Falconer
Sunday, March 17, 2002

What must the great programmer know?

1. The location of Google Groups

Er... that's it.

I agree most development seems easy, but I am constantly amazed by the simple things that can stump people. What is even more amazing is when they struggle for hours/days/weeks without trying to find out if someone else has had the same problem.

Everyone knows about code re-use but knowledge re-use? Real engineers do not re-invent the wheel without a damn good reason. Software engineers seem to revel in re-inventing it.

Monday, March 18, 2002

db - to my mind you hit the nail on the head. it is why patterns are so useful to me - as soon as i recognise "oh, that is just the observer pattern" i know the problem is solved and i can get on with actually doing those bits which are unique to the system in hand. it cuts out shed loads of development work in designing some solution (which turns out to be just the same as the one i did two projects ago), writing code, fixing bugs, etc. perhaps we could just say that "good programmers are lazy" :-)

Monday, March 18, 2002

Tony, when I learned cooking, it was important to learn the knife.  Food needs to be cut and shaped, and for many tasks the knife is simple but versatile.  Are knives hard to use?  No, any idiot can learn to use it without cutting oneself.  And while I can imagine a brilliant chef who never really cuts anything, I would normally consider a great one to know how to use the knife.

While this is a metaphor, I think it stabs at the heart of what I think on what a passionate programmer comes to have an acquaintance with.  I have thought as you did, but I must repeat, these random things like knowing knives don't make the chef, but the chef knows them anyhow.  Being conversant with computation may just mean you're a monkey with a memory, but everything you know really explodes the possibilities of what you can do.  Intelligence does not make the programmer, knowledge is what carves the programmer out of the intelligent person.

Richard J.
Monday, March 18, 2002

Problem solving skills.
I work with many highly intelegent people. The best programmers can find bugs. Fixing them is usually easy, finding what to fix is the hard part.
Great programmers don't get stuck on on part of the problem. They can separate the interesting bits from the crap because they truely understand their code.
Most of all, they have more than one way of looking at the problem. They never assume they know what the bug is and throw off a quick bandaid. The best are not happy until they understand what is broken, why it broke, the best way to fix it, and how we will prevent the same problem in the future.
The truly great programmers can do all this under pressure.

Doug Withau
Monday, March 18, 2002

Richard, I see what you mean, I think you are confusing the roles of a mathemetician or philosopher with those of a software developer.

Monday, March 18, 2002

Richard J. wrote:
"What must the great programmer know?"

1) How to write readable code
And I mean making it so readable that it's fun to read in bed before you go to sleep. Or that any junior programmer thinks the stuff you write is simple.

2) When to split up in smaller chunks.

Often overlooked, but combine those two and you'll be amazed how much productivity goes up.

Jan Derk
Tuesday, March 19, 2002

The great programmer must know that (s)he has wasted a life being a programmer.


Tuesday, March 19, 2002

I can easily agree with that last comment Tony, but that's not relevant for my purposes right now.

Frankly, do what you're passionate for.  I can easily forgive an underprivileged person for not doing that.  I know it sounds cold, but I have less sympathy for privileged people who don't, unless someone really has an emotional hold on them that forces them into an unhappy life.

As for me, I'm doing what I love right now, even if the business world is the worst part of it.  But I won't love it forever, and eventually it will be a tool in attaining what I'll want then.

So, all I care about is what makes an incredible programmer.  I don't care about the negatives of asking such a question, because though this stupid Richard needs to be bludgeoned into seeing reason, asking questions is in the end better than not.

Richard J.
Tuesday, March 19, 2002

> What do you think that a passionate programmer should know?

1) should know better (ie be able to learn good/better from other people/sources); 2) should know some restraint (e.g. don't use expensive surgery when the patient only needs a bandaid); 3) should know no limits (when unlimited or less limited is appropriate).

Christopher Wells
Tuesday, March 19, 2002

>1. how to read other's code...
>2. how to instinctively refactor their own code to make it more generally useful, more readable, more concise
>3. how to sit down and *STUDY* a computer book or manual, straight through, for its own sake
>4. how to use a debugger and a profiler
  Better still: how to avoid using a debugger
>5. when to give up for the day and go home
  Also, take a break every 90 mn.

I would add: how to _name_ things correctly (in english, using nouns and verbs). And how to summarize a design on a single sheet of paper.

Bruno Bonnefont
Wednesday, March 20, 2002

A good programmer is one one who is highly technically proficient.

A great programmer is highly technically proficient AND highly business proficient.

Wednesday, March 20, 2002

That's all.

Markus "Mac" Gustavsson
Sunday, November 09, 2003

The ability to :

1. Characterize a problem.
("When we do A, B happens)

2. Solve the problem.

3. create a test to see if the probem has been solved.

Mr.Analogy (ISV owner)
Sunday, August 15, 2004

From my experience of having worked for a large enterprise, I found that while it is true that writing bug-free, maintainable and expandable code is important, the more important skills that programmers should have are communcations skills and the ability to accurately translate requirements into design and code.  It doesn't matter how good of a coder you are if you're not following the requirements.  You'll just end up making the wrong stuff that nobody wanted in the first place.  Also, being able to effectively communicate to other coders and also non-tech managers is important or else you wouldn't be able to solve problems or collaborate with others effectively.

Saturday, August 28, 2004

*  Recent Topics

*  Fog Creek Home