The Urge to Do It Over

By Steve Gibson in InfoWorld, 1989

I've been programming computers during the last 20 years of their evolution, beginning back in the late 1960s. At one of the many companies that I had the honor to help build throughout the years, I met a man named Jon Lundell. Jon holds to this day the title of the most brilliant programmer (and perhaps the most brilliant person) whom I have ever known. His personal style was one of few words, but when he spoke everyone listened. I was so entranced by the sheer acuity of this man's vision that I always listened quite carefully. I want to share a truism about software that I first heard from Jon and that I have often restated since.

The thrust of Jon's insight into the art and practice of software engineering was that any complex computer program that is on the scale of a software system has to be written, and then completely rewritten, at least three times to get it right.

Whenever I've presented this truism to user groups, I invariably see a large body of smiles and wise noddings from the audience, so it's clear that the feeling of "I wish I could start this over from scratch" is a common experience for programmers. It seems that the act of coding a detailed solution to a sufficiently large problem teaches us so much about the problem that we invariably find ourselves feeling that we could have done a much better job on the whole thing if only we'd started out with as much understanding as we had gained in the process.

Although to a lesser degree this phenomenon shows itself in many facets of our daily lives, I can't recall ever feeling it more strongly or more recurrently than when programming computers. Even computer-oriented design work, like setting up a large and complex spreadsheet or database, easily creates the feeling of "I wish I could scrap this whole thing and start again." So I wonder what it is about working with computers and programming, that creates this feeling.

I know it's not unique. Everyone who has struggled with using computers to solve problems has probably felt something of this. I've also always felt that there's something special about programming, something that is, for me, laced with addictive overtones and undercurrents--something that hooked me 20 years ago and hasn't let go. Looking inside myself for a clue, I emerge with the thought that it's all about art and learning.

I'm never further away from boredom, and never more challenged, than when I'm casting my intentions into code. Since there are aspects of a computer's depth that are clearly infinite, or at least far surpassing our human capacity for complexity, there's this feeling that I'm directly challenging myself. However far I can reach, however complex and elegant my solution can be, the computer is there to contain it and to fill it with life.

So picture the fabric of computer solutions as a vast panorama upon which virtually anything we can imagine can be painted. This makes the particular solution we cast a uniquely personal statement. One that is an expression of who we are at the moment. It means that computer software is at the same time both an expression and extension of ourselves, while fulfilling its role as a highly functional mechanism. Complex software is functional artwork—an inspiring form with a clear purpose.

The personal growth that we feel throughout the process of software design can be explained by the fact that it can be so challenging. And since the result is a direct expression of our own current state, it's no surprise that such a high degree of interaction and evolution exists between the project and the programmer. Each works upon the other, forever changing what the other will be.

So I suppose I can see what Jon meant and perhaps why he is right. We grow so much through the act of casting our concepts into code that the course of a large nontrivial project can teach us much. Emerging from the other side of the job, we typically discover that we have a more complete understanding of the problem than when we began, and we might see things about our solution that now seem inadequate or inappropriate.

It must be that certain personality characteristics interact with the nature of computer programming to create people who were "born to program." Sure, it's a horrible job, but somebody has to do it.