On Algorithm Development and Humble Programmers

Have you wondered how to design an algorithm? Or analyze it? Do you know that the “Principles of Algorithm Development” was a Ph.D thesis of Jon Bentley, written as far back as 1976? I did not, either.

I found this, thanks to one of those DDJ Conversations. Jon Bentley’s Programming Pearls is a classic and something that needs to be on the reference shelf of every developer. Here are a snippets of the conversation.

Principles of Algorithmic Design

The principles include generalizing, using high-level and abstract description of algorithms, examining degenerate cases, and employing standard speed-up tricks.

The difference between design and analysis of algorithms

The goal of algorithm design is to develop a good algorithm; the goal of algorithm analysis is to understand how good an algorithm is.

Programming is subtle

Programming is subtle, and we must learn from Edsger Dijkstra to be “humble programmers.” We have lots of tools to use: Precise specifications, formal methods, and extensive tests among them. One of the best tools is the eyes of really smart friends.

I love the conclusion of this interview. It is something to remember.

Dig deep enough, and you’ll find interesting algorithmic problems at the heart of most real systems.

Best to Market…

According to Alan Cooper, the “best to market, trumps first to market”. He gives the following examples.

  • An ergonomic peeler versus a dinky metal peeler
  • Some clunky MP3 player versus the iPod
  • AltaVista versus Google

His advice to Interaction Designers, whom he was addressing at this conference:

We need to stop asking for permission and resources and show them how to achieve to seek success. We are an insurgent cadre of revolution.

On the higher cost of building:

The most expensive thing in business is opportunity cost, which is the cost of what you didn’t do while you were busy doing whatever you did do. Thus, it’s double or triple as expensive to rush a crap product to market. There’s no group of consumers waiting for you to ship your bad product to market.

On Prototypes and Code:

Prototypes are software. I believe that there’s a role for prototypes in interaction design, but I believe it’s a very small and limited role. It’s primarily done as a narrative, not as software. The risk of doing interaction design in a medium of code is much greater than the benefits yield for you. We as competent craftspeople should be able to communicate with great precision and clarity what we intend the software to do without resorting to code.

Code is a sledgehammer here. Prototypes are code that has not achieved released. Snippets of disposable code are great tools for design engineers, but they don’t play a large role for interaction designers.

Thanks to  Ben Galbraith who is blogging about Interaction Design, including this keynote..

LinkLog: Programmers and Programming

I have been collecting some links that describes/categorizes programmers and their attitudes. Some of them are brutal and others hilarious. Here are a list of links.

Three Levels of Programmers

I don’t like the classification – Good, Lazy and Bad. I would rather call them – Tool makers, Tool Users, Grunt workers. A Building Tools mentality is something different from Using Tools mentality. I don’t agree that one is superior to the other.

The Cults of Programming

I can identify with a few of these myself especially Ease Cult and Uncertainty Cult.

The Cult of Language Expertise

Language expertise is fine, but it isn’t the most valuable thing out there. If someone programs conscientiously, I can work with them.

How to Recognize a Good Programmer

Passion, Self teaching and love of learning, intelligence are all mentioned in this article. Formal education is last in the list. I would add a couple of more – empathy for the users (of your software) and certain amount of Pride in your work, goes a long way too.

Teach Yourself Programming in 10 years

Researchers (Hayes, Bloom) have shown it takes about ten years to develop expertise in any of a wide variety of areas, including chess playing, music composition, painting, piano playing, swimming, tennis, and research in neuropsychology and topology.

This is my all time favorite. It is a must read for anyone aspiring to be a programmer.

I will keep this updated whenever I see a new interesting entry. If you find something interesting that should be in this list, please add a comment with a link.