Whenever I learn a new subject, the most difficult task is finding a way to put that subject into some kind of conceptual context. I’ve found that before I get interested in the “how” of a subject, I always need to know the “why.” I don’t like to tackle anything in a vacuum. There needs to be some sort of larger story into which I can fit the subject at hand that explains why that particular subject is important and how that subject interacts with other related concepts.
So “why” learn to program?
Prior to coming to the Piscine, I hadn’t answered the “why” question. Yes, I knew why I was interested in being a programmer (mainly the challenge of it and, of course, the opportunity to make more money than current my $15/hour job). That isn’t the “why” question I’m addressing.
The real question to ask is, why is programming important in the first place?
As simple as the answer may be, the question is actually really important. Programming is not a subject to be learned in a vacuum. Beneath the fancy frameworks and software stacks that we take for granted today, there are high-level programming languages. Beneath these high-level programming languages, there are lower-level programming languages. Beneath the lower-level languages, there is assembly language and machine code. Beneath that, there is a computer architecture and, even lower still, there is physical hardware. You get the idea.
The point is, the discipline of programming is part of larger framework which encompasses everything from the physical constraints of the machines that run the code to the theories of computation that gave birth to the machines themselves. You can’t tackle of the question of “why program?” without taking into account this larger context. It is only within this larger context that the why question becomes meaningful.
So, within this context, what is the answer to why?
Well, I believe that programming is important because it, along with the machines that are programmed, is the fundamental tool that allows us to codify problem-solving. Programming languages have, over the past century, been used to solve challenges that were previously unimaginable. They make possible the creation of machines with more computational power than has ever been available to mankind. I know these are pretty grandiose terms to think in, but the reality is that we constantly underestimate the power of modern-day programming languages.
The true practitioners of programming - the real programmers - do not make this mistake. The founding figures of computer science as we know it, mathematicians like Jon Von Neumann and Alan Turing, knew the significance of what they were developing. They knew the size of the problems they were attempting to solve. They knew that their solutions were nothing short of world-changing, as indeed, they were. They worked to solve insurmountably complex problems, and as a result, their work produced undeniably original solutions - solutions that just so happened to lay the foundation for the next century of development in computer science. Their focus was always on solving problems. They understood that programming is fundamentally just a tool; the real significance is in the problem-solving.
Following their lead, as obviously we all should, I understand that the real “why” of programming will always lie in the problem-solving. Programming is only significant in so far as it is used to solve truly meaningful challenges.
Which technology is trendier than another simply does not matter, nor has it ever really mattered. Arguing about those things is, at the very least, entertaining (especially to those with nerdier interests like myself), but ultimately they distract from the really significant gem of conversation - namely, problem-solving.
I didn’t grow up programming away on computers from an early age; I came to art of programming only a few years ago in search of something significant to do with my life. I believe that the skill of solving complex problems is that something of significance - programming and computation just happen to be the tools of choice.
The problem-solvers, like Neumann and Turing, are the ones who truly achieve anything of significance. They are the ones who understand the “why” of programming. For my part, I simply hope to follow in their immense shadow and strive to be a problem-solver - not a “developer”. Only when I adopt this understanding is programming anything worth pursuing.