A good way to learn how to program is to build actual software. But what should we build when trying to learn? It seems to me that as learners we are often not sure of what to build.
It is important to build and ship a working thing as beginners because doing so can teach us a lot about programming. Often, writing good software depends on one’s style and intuition that can only be cultivated through delivering and maintaining varieties of software. Those skills cannot be quantified and imparted to us by tutorials or lectures. Rather they come from experiences.
There are two reasons why it is hard to know what to build. To begin with, it is hard to get ideas in the first place. Anyone who has ever stared at a blank sheet while trying to write something would have experienced this firsthand. It is even more difficult, as a beginner, to measure how complicated an idea might be in its implementation. To sum up, it is hard to find an idea and to ensure that the idea is adequately difficult so as to challenge us at just the right intensity.
One obvious solution to such a problem is to get told what to build. However, there is something about coming up with an original idea and building it that we just cannot experience by following tutorials or doing a project given by instructors. Therefore I would argue that the best thing we can build when learning is whatever we think is cool.
Build Your Thing
What makes building our own ideas particularly helpful is the fact that doing so entails an element of uncertainty. We are completely in charge of dashing headlong into an unknown territory with nothing but an abstract idea of what we would like to build in the end. In order to overcome the uncertain nature of our endeavors, we have to be more persistent and resilient than we would otherwise be in controlled classroom environments. Any knowledge forged under such desperate mindset, in my view, lasts way longer than that which has been simply inculcated onto you.
Uncertainty pushes us to the extreme where we are left to make all the wild decisions and the direst of mistakes. The decisions we make are neither safeguarded by a curriculum or judged by instructors. And in this unsupervised environment, we assume the full weight of our choices and their consequences on not a hypothetical but the real world.
The owners of our journey are us, not authors of some tutorials, classmates, or instructors. And when the journey is undertaken with struggles in the utmost uncertainties, the paths we take are all the more memorable and mistakes more painful, because we made conscious decisions to follow them in pressing situations. All in all, the learning is more vivid in the dark of uncertainties.
Personal Backlog of Ideas
Then how can we come up with these original ideas in the first place? What worked really well for me is to keep a private backlog of random ideas. Although ideas are hard to get, they do come by in the most unexpected moments. They might come when you are riding a bicycle or wake up in the morning. When they come, chuck them in a backlog so that you can remember them later and maybe even make them a reality.
I have a number of Trello boards in which I throw in my ideas and track their progress. There are boards for open source project ideas, silly ideas, startup ideas and more. The following is my board named “random ideas.”
In it, you can find goofy ideas such as
- control air conditioning with Slack poll
- Atom plugin to shake screen as we type
- Hacker News user profile card on hover
Indeed, the ideas on the board are largely garbage and I will probably never work on most of them. But sometimes I do pick up an idea and start tinkering. And every time I learn something that I did not know. Every time I am pushed to the zone of discomfort that no classroom or workplace has ever managed to take me.
You Cannot Plan Everything
When you are pushed to that zone of discomfort, you will sometimes realize that the idea is too advanced for you to implement. And that’s okay because there is learning in trying with all our might and failing. In other words, we grow when our motivation reaches the confines of our abilities.
Time and again I learned a lot from failed projects. For instance, two years ago I had an idea of making a new programming language and started building ny. The idea was to build a statically typed language with functions as first-class citizens like the following:
fn f1(a int, b int) fn fn(c int) fn fn() int a + b + c
I built it for two weeks while studying the repository for Ruby language, but did not get much further than implementing a REPL that could handle arithmetic operations. Basically, it was a glorified calculator.
$ ny > 1 * (5 / (2 + 3) + 2) 3
Although building a fully-fledged programming language was beyond my skill set at the time, through the attempt I was able to teach myself interesting things I had not known. For instance, I finally understood how programming language interpreters perform lexical analysis and build and walk abstract syntax tree to execute instructions. To this date, this knowledge is fresh in my mind, and I find myself using these concepts to solve other problems. On the other hand, other computer science knowledge I have gained through various tutorials are not as fresh in my mind.
We cannot really plan every aspect of our learning because the very thing that makes our learning vivid is uncertainty. Of course, we will sometimes bite more than we can chew and fail to implement our ambitious ideas. But we become more mature and more knowledgeable in the process of fighting the uncertainty to break the constraint of our current knowledge.
There is something beautiful about learning on our own terms because in doing so we give ourselves into the world we do not know. In it, no one can catch us when we fall or bail us out when we are trapped. Despite knowing that, we still venture into the unknown land toward our destinations. Some will succeed and some will fail. Yet at the end of the day, we all emerge weathered and victorious in their own right.
So let us go build those strange ideas that only we have and no one else has. And in doing so we will have taken a small step towards the world of unknown. The journey is not always reasonable. Yet, after all, the willingness to take those illogical strides is the very thing that makes us learners.