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:
- Figuring out how the software currently works
- Figuring out what it should do differently
- Figuring out how to make it do that
- Communicating what you've figured out to other people
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.
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.