I want to take a moment and record some of the things I've been doing lately in order to become more effective at getting things done when it comes to building software. I have a problem that I'm sure a lot of people will be able to relate to.
I attempt to build or learn something, but somewhere along the way, I become discouraged, distracted, or sidetracked. The outcome is that I spend a lot of time "programming," but never actually accomplishing the thing that I set out to do in the first place. While I wouldn't go as far to say that the time was wasted, it's frustrating to look back and wonder where all that time and effort went.
More specifically, here are a few things that I have found myself up against:
- I wanted to learn about the cool web audio API, but soon after I began, I became overwhelmed, and stopped trying.
- I've had an idea to make my dream budgeting app for a couple of years now. Every time I begin working on it, I loose focus and energy, until I stop working on it completely.
- I was inspired by playing DDR to code up my own version of the game. Suddenly the project morphed into an in-depth study of Redux and immutable data. These are all wonderful things, but what the heck happened to making my DDR clone?
- I was really excited to get that one programming book for Christmas, so now it's April, and why I am still only on Chapter 2?
Those are a few examples to help illustrate what challenges I have faced before. Hopefully I am not the only one with these types of challenges. So, I'm sharing a few things that I have found to help me overcome these kinds of scenarios in software development. This is nothing revolutionary at all. In fact, I feel a little silly writing this article because I think everyone already knows about these simple things. The problem is that the simple things are often the hardest and most important to do consistently.
Don't rush into it
Think about what it is you're trying to accomplish. Figure out the most minimal version of what you want to learn or create, and make that your first objective. Strive to understand the problem and how it could be best approached before you start writing code. Pinpoint grey areas that might need some additional thought or consideration. Rushing into code will usually lead to wasted time.
Break it up
I've found this to be so important. Break up whatever it is you're working on into bite-sized chunks. I try to separate goals and projects into the smallest possible unit that makes sense to me. This helps make a large task more doable. Working in small, quick iterations will keep your mind focused and engaged. It will help fight burnout. If you're working with others, it will be easier for them to reason about your work and to provide feedback.
Write it down
I really like to write down a description of the task or goal, along with a few solid requirements of what the task is intended for. Understanding something in your mind is one thing, but being able to articulate it effectively will help you understand the goal or challenge even more. Writing down a goal makes it more real. One other benefit of recording the tasks and goals is so that you will have it as a reference in the future, as well as a guide as you work on the task currently.
For example, while I was learning how to implement an authentication system, I recorded the requirements and description of what I was setting out to accomplish. I referenced the written description of the problem as I wrote the code. Now I can look back on it as a well-documented reference. Again, if your working on a team, or with others, they will appreciate the level of detail you went to in documenting your task and solution.
Stick to the plan
While coding it's important to base all that you do on the requirements and problem description that you've created. With these things in mind, it's a lot easier to avoid going too deep into something interesting but unplanned. If I find myself starting to wander, or forget what I am doing, I look at the plan I created, which puts me back on track.
It's great to be curious, and to want to explore different facets of the things you work on. I like to take the same strategy of planning when interesting things pop up in the code. Just take a moment to make a note of what you'd like to come back to, and then keep going with your original goal.
Make it a goal
Consider what motivates you to get things done. I think it's not a bad idea to create time estimates for yourself. This is one of the hardest things to do correctly, so it's a valuable skill to practice. Think about how you might measure you're progress. Explore tools to help you work effectively. I love using GitHub issues for pretty much all of the work that I do. It's ideal for me because everything I code is on GitHub, so I like having everything in one place.
These tips are what works for me. I hope others will be able to draw from these and come up with their own. Most of these things I have picked up from work, and I have been impressed how well they carry over into my own personal coding, and even just my personal life in general.
I've recently taken on a couple projects for a friend. It's been a great experience for me as I have strived to follow these strategies. I'm able to stay focused and get things done in the little spare time that I have available.
It's not fun to see an exciting project soon abandoned, as it sinks deeper and deeper into your GitHub repository list. Continuous learning and creating is what I value most about writing software. I believe it takes effective planning to fully achieve these experiences.