Why I Program
I can't remember when my grandparents got the Tano Dragon 64. They'd probably had it since before I could form memories. What I can remember is playing The Tower of Fear, a text adventure similar to Zork which to this day I have not beaten. I remember a strange flying game where my wings constantly iced over, causing me to crash. There was a spreadsheet application, a mining game, an early word processor. All of these were loaded from cassette tapes.
And it was magic.
I'd had interactive toys, of course. But the interactivity was largely limited to press button, make sound. This computer was something different. It could do things it wasn't originally intended to do. And one day I discovered that I could make it do things it wasn't originally intended to do.
So naturally the first thing I made it do was swear. Well, not exactly swear, but I did replace some in-game messages with phrases which at the time were slightly taboo. But mild profanity aside, if the computer was magic, then programming gave me power over the magic. This was a magic I could wield, and it was amazing.
I loved the idea that little me could make this mysterious device do entirely new things, things maybe no one had ever even thought of. My first programs were largely exercises in just making the computer do, well, anything. I wrote quiz programs that would ask you questions, then give you the answers regardless of how you responded. In grade school I can vaguely recall we had Commodore PET computers that supported a BASIC dialect. So I wrote and tested some code on the Dragon 64 at home, wrote down all the lines in the back of a notebook, then re-keyed the program in at school. What did it do? Flashed the word “ERROR” repeatedly in varying colors. I tried, unsuccessfully, to convince the teacher the computer was going crazy. Such a prankster.
Eventually I started writing programs to solve problems. I wrote a simple map manager for Duke Nukem' 3D. I wrote a lottery pick tracker (I reasoned that some of the balls they used in the drawing must weigh slightly more or less, so the more frequently a number came up, the more likely it would come up again). We never won the lottery. I wrote factoring software to save time doing math homework. I wrote graphing software in Quick BASIC. Once, when as punishment I was to write an apology one hundred times, I convinced the teacher to let me write a program that printed the apology one hundred times instead. That may have been less of a punishment, but it was an significantly better use of time. I wrote many tiny utilities to fill my many tiny needs.
Of course, the novelty of just being able to make a computer do stuff wore off. I went to college for writing code (Computer Science), but gave up on that and instead got a degree in writing a slightly different kind of code (Web Development). I got my first career job writing websites and building internal tools in C#. I learned more about coding a few months on the job than I did in my five years of post-primary education. Programming became a thing that pays bills.
But there was still magic in the accomplishments. I fixed bugs. I improved processes. I made a process that had previously taken twenty minutes complete in less than two (thanks
SqlBulkCopy!) I made a site with CSS-based layout (which was a big deal at the time). And of course I built a home-grown, hair-brained CMS system, which in retrospect was a terrible idea but still magical at the time.
And over time those accomplishments became… not exactly easier, but more obtainable. Figuring out how to do something became less difficult. Figuring out the best way became more difficult. My goals changed. I began to favor simplicity. I started taking pride in both my code, and the not-code things. Nailing an estimate. Clamping down on unnecessary complexity. Foreseeing issues and suggesting viable alternatives before the project went to hell (sometimes).
And yet these are all areas I have plenty of room for improvement. Being a proficient developer is an endurance event. Discipline, empathy, and communication skills are just as important as technical prowess.
And even when things start to turn routine, I still occasionally surprise myself. Years ago I stumbled on a parsing framework called Sprache. I used it to write a simple language, which had seemed like the kind of thing only the ancient masters could possibly do. Turns out that with enough time, thought, and careful study, I could do it too, eventually. Granted, the language I made up was awful, but it existed and technically worked.
Since then I've implemented my own parsing frameworks. Both have flaws. The one I wrote in C# is, in my not so humble opinion, very elegant. But it's also slow and resource intensive. So I wrote another parsing framework, this time one that generates code to do the parsing. I was meta programming. And once again this was something I'd previously felt was beyond my capacity. And once again I surprised myself.
And I think that's the magic of programming for me. There is such a vast expanse of skills and ideas to pursue. So many challenges to be conquered. And so many resources to help me conquer them. I am certain I could do this the rest of my life and still not know or have done it all.
The only limit, is yourself.