I used to get stuck in a self-destructive rut in which I would start a project, get some of it done, and then drop it when I came upon a particularly difficult problem. Sometimes the problem was working with a library I didn’t like, having an issue with the build system, or just not understanding a concept well enough. Whatever the problem was, I would lose my motivation and promptly begin a new project. And of course, the start-work-drop cycle would continue. I must have five game engines collecting dust which work well enough in some respects, but aren’t quite usable. I have piles of half-finished projects lying around that I certainly could have finished.
For months I wondered why I couldn’t finish these projects. Sometimes I thought I just didn’t like writing a particular type of code or using a certain language. Slowly, I saw what I was really doing. My goals were lofty and challenging, but I rarely followed through. I didn’t push myself; I avoided the tough problems which would have led to improvement and a completed project.
The goals I set for myself are still outside of my comfort zone and the limits of my skill, but now that’s a good thing. To improve, you must push yourself past your limits. It’s like running — If you never try to beat your time, you won’t run faster. Working within your limits can definitely be productive, but how can you learn something new by doing only what you already know? It’s good to not go too far too fast, but some challenge is necessary. The experience of overcoming difficult problems engenders progress and expands your limits. Once you become comfortable with what was once challenging, greater problems and further improvement can be sought out.
I have found it fun to have goals which are focused on a particular thing which I want to improve. For example, I am learning Haskell. My goals are slowly driving me to learn the language. First I’m just doing practice problems and tutorials. Nothing too difficult, but foreign enough to keep it challenging. My overall goal is to write a full, useful program in Haskell. Right now that’s far beyond my skill level, so I need to slowly ramp up the difficulty of my goals to get me to a point where I can finish that program.
Goals are ineffective if you don’t have the will to complete them. I kept failing because I didn’t have the drive to push through those difficult times and keep learning and improving. Attack the difficult problems. Keep up momentum and continue making progress. As slow as it may be, if you stop progressing you’re liable to stop working altogether. So push past those problems and always take steady, measured steps towards the goal.
My inspiration for this kind of goal setting is what Cal Newport calls “Deep Work“. He advocates setting goals to stretch yourself, which serve the same purpose — to push you past your limits and force improvement. I’ve made deep work a habit; something I do without necessarily meaning to. Cal takes a slightly different approach, saying that one should create an obsession with doing deep work. Either way, nurturing a mindset of constant improvement is crucial. Always strive to improve, and don’t back down from tough problems.