On Being Curious

Those of us who have decided to enter the rewarding—and occasionally frustrating and exhausting—profession of software development know that learning is a daily requirement, a subject I have written about before. If you include yourself in that description, you also know how quickly you see the limits of your knowledge of the field recede before you as the cutting edge of software pushes ever onward—or find yourself spinning in circles as the software industry chases its tail, however you care to visualize it.

If your employer has any understanding of what they hired you to do all day, they should be willing to contribute to your education with reimbursements and learning opportunities, but ultimately we programmers are responsible for our own education. Maintaining the motivation to do all this learning requires, in my opinion, the desire to know how things work, how different concepts fit together, how a new idea can improve on an existing solution; in a word, it requires curiosity. There are plenty of incurious people out there—some of whom you will work with, like the manager on your software project who has no concept of how software is developed and no motivation to learn; that’s for those computer nerds to worry about—but for someone faced with the task of keeping up with the pace of the technology industry, a native sense of curiosity provides the internal motivation needed to be excited about this prospect and not simply overwhelmed by it.

As a self-taught programmer, I don’t think I could have gotten far in my career without this desire to understand. There were certainly extrinsic motivators: I had bills to pay and did hope this would be a way to meet my financial obligations. But the intrinsic motivation of curiosity is what allowed me to keep at it, day after day, until I had amassed enough knowledge and experience to actually have something to contribute. A decade and a half into my career, I still have plenty to learn, and so far I am not sad about that.

The World is a Big Place

Curiosity means discovering over and over again that the world is more complex than you thought, that there are worlds hidden away in the seemly commonplace, that even the number of subjects to learn about is more than you could have guessed. The knowledge that the world is immense and effectively infinitely complex, that the part of it that you personally will ever understand is a fraction of the fraction that has come under human understanding, is an antidote to the Dunning-Kruger effect, allowing you to remain humble as you progress in knowledge and understanding.

Because there is always too much to learn, the question becomes: how do you fruitfully spend the time you have? Should I start on a new programming language? Do I need to understand cryptography on a deeper level? How about Machine Learning? Do I need to spend more time looking into blockchain technology? And which blockchain?

There is not much I can say about this question that will be broadly applicable, so I will abstain from offering my own solutions. Instead, I will make some observations about what it is like being in this state of awareness that there is too much to learn and not enough time, while the time you do have is constrained by the requirements of professional life.

So Many Books, So Little Time

I love books, and although book purchases make up a significant amount of my discretionary spending, I have no problem parting with those I’ve already read, as a donation, a gift or sold online. Instead of being an archive of what I’ve read, my bookshelves hold my anti-library: the stories I have not yet experienced and the subjects I have not yet explored.

These books tend to accumulate faster than I’m able to read them—finding time for prolonged reading in our attention-starved times can be a challenge. This may sound callous, but I can relate on some level to the protagonist of the old Twilight Zone episode who, after finding himself the lone survivor of a nuclear apocalypse, is less troubled by the lose of life than he is elated to finally have all the time he needs to read.

A benefit of living in this world of internetworked devices is that accessing reading material is easier than it ever has been, with multiple platforms to do our reading on. While I would like to have more time to spend sitting in a chair listening to music with a physical book in my hands, it is nice to also be listening to an audiobook in the car, and to pull some reading material up on my phone when waiting in line.

Author and philosopher Joseph Campbell apparently spent 5 years of his life doing not much more than reading, a luxury of leisure time I can envy even if it was forced on him by the Great Depression. With the probability of being stranded on a remote island that happens to be equipped with a substantial library being remote at best, the alternative is budgeting time to do the kind of reading I want, while keeping up with the reading that is necessitated by professional obligations.

Reading for Programmers

While I would be happy spending my time perusing my anti-library at leisure, in practice much of my reading is dictated by professional responsibilities. Being a programmer, many of books in my anti-library are related to computing; a fellow programmer would recognize on many covers the woodblock-print animals that define the O’Reilly Media brand.

Blogs, tutorials, ebooks, wikis, and documentation are all sources that programmers must utilize to track down the million individual pieces of information needed to put together a software system of any significant size. This type of learning is more of a hunt than a leisurely stroll, and often you are chasing down some very specific piece of information, following whatever tracks you can find, hoping to corner your prey in the end—in this analogy, the prey might be the Stack Overflow reply that provides a fix for the error you have been struggling with for the better part of a day, the answer to the riddle that some cryptic API is posing to you like a Sphinx blocking your path.

Type of Learning

There is the kind of learning you do when you don’t have an immediate goal in mind and can wander from one thing to another, what we can label exploratory learning, and the kind in which you are hunting a target, what we can call targeted learning. This is not meant to be an exhaustive taxonomy of all the types of learning that a programmer engages in, but rather the most general types that I recognized in my day-to-day work.

Exploratory learning is generally the more enjoyable kind, as you are free to start with whatever catches your eye and follow your pleasure from one topic to the next, with no immediate need to satisfy. You might check out Hacker News and find a promising topic on a blog, then follow a link to a Wikipedia article, then look up a book referenced in the article. You may be looking into some new technology because you heard good things about it, or because you started a project that uses it extensively and need to get up to speed with it. Maybe you have an interview coming up and want to look half-way competent with it. Maybe you came across some technology that piques your programmer’s curiosity despite being so obscure that there is no chance you will ever use it professionally.

There are any number of sources of impetus to pick up a subject; in any case, this is the kind of reading you do on your own time, when you are at your leisure to pursue your own interests without having an immediate goal in mind. It is learning without a set curriculum, grabbing at whatever thread you come across and following it until something else catches your eye.

Targeted Learning

What is missing from this meandering type of learning is a sense of accomplishment, the type you get when you find that elusive fix for an obscure error message, or discover the technique that will allow you to simplify a significant amount of code. As has been observed, constraints engender a certain freedom, as anything you cannot change is one less thing you have to think about—in this sense we can think of exploratory and targeted learning as ends of a spectrum rather than a dichotomy. Serendipity can happen, and there is no reason you couldn’t run across just the thing you need in a fortuitous accident, but you are much more likely to have this experience when you know exactly what you are looking for, and that is what you get from targeted learning.

Learning is targeted when you are scanning the API documentation of a huge framework for the hint of a possible solution to a problem you are facing, or hoping a Google search for an error message turns up a fix in a discussion thread. This is a field in which being efficient with tracking down information is as important as what you already know, and while exploratory learning gives you the opportunity to looking deeply into an area of knowledge and form the mental associations that help to reinforce learning, professional responsibilities generally require that you spend much more of the workday hunting down pieces of technical minutia needed to implement a deliverable feature.

Kanban as Learning Tool

There is a mechanism built into the human psyche that lets us pursue goals, some part of our mental equipment that allows us to set a target and keep track of our progress, and to feel a sense of relief and accomplishment when it is completed, or disappointment if the target is missed. Books are divided into chapters and sub-sections to organize the information; this has the side-effect of providing a place to start and to stop, a way to gauge progress and allow for the feeling of satisfaction when you make it to the end.

The Kanban method of tracking work allows you to view the progress on an individual task while giving you a look into the bigger picture that it is part of. It consists of two simple rules:

  • Visualize your backlog
  • Limit work-on-progress (WIP)

I don’t want to sound like an advertisement for any methodology; this does not require you to hire a consultant or get a certification, and it does not require you to use any specific software. While traditionally a Kanban board consists of sticky notes applied to a board divided into workflow stages, I have been using Emacs Org-mode and its support for To Do lists with custom states as my Kanban board. The point is that visualizing your backlog and WIP has the side-effect of giving you the sense of progress and satisfaction with completing a goal that helps with maintaining momentum.

I am also a Goodreads user, and while it doesn’t provide the best user experience, and has a hopelssly confused recommendation engine, it functions effectively as a Kanban board for your reading. Aside from displaying rating and reviews—which I personally think have limited value unless you know the person doing the rating and reviewing—it allows you to inventory and tag, or “shelve,” your reading material and to keep track of what you want to read, what you’ve read, and what you are currently reading, including current progress; all useful information to help you stay motivated and give you a sense of what you have already accomplished.

Conclusion

Being a curious person is a net positive, the haplessness of curious cats notwithstanding; at the least you don’t have to worry about ever getting bored and will always have something to look forward to. This embarrassment of riches comes along with the reality of the limitations of time and energy, the fact that there are more books worth reading than I will ever get around to. I prefer this problem to the opposite situation, the thought of exhausting all the reading material in the world and having nothing to look forward to, like Alexander the Great weeping because there were no more worlds to conquer.