View: Programming as Figuring Things Out

Yet another view is that the main task of programming is figuring things out. That is, collecting information, making inferences and deductions, forming hypotheses, testing them, and summarizing the results in a way that someone else can understand.

In short, programming consists of:

Software development is an exercise in learning.

Dave Farley, "How to Estimate Software Development Time"

If we set things up to maximize learning instead of production, the value produced goes way way up.

Kent Beck (video)

Software is what we learned along the way.

Jim Nielsen

Software is the insights of the development team made manifest.

Baldur Bjarnason

All that figuring out is what software developers are paid to do. The stuff that developers figure out constitutes their employer's software IP. Their collective body of knowledge is a large part of what makes one software company more valuable than another. It's imperative, therefore, that developers pass on what they learn to others (e.g. by PairProgramming), so their knowledge isn't lost when they switch teams or companies.

Figuring out doesn't happen entirely in your head. It's usually a Dialogue between you and the machine. You read some code. You have an idea. You write some code. It doesn't work the way you thought it would. You figure out why it doesn't work, and you learn something. You try again and again until you get the results you expect.

This process might look inefficient, but inefficiency is relative. It's only inefficient if something else would be more efficient. In general, typing is cheap, computers are fast, our brains are slow and limited (see: SoftwareDevelopment/Humans), and coding mistakes are easy to undo as long as we catch them quickly. For all of these reasons, performing experiments in the codebase is often the fastest way to learn what will and won't work.