Intentional Practice: My Journey to Becoming a Better Developer
As a software developer with a unique background as a former professional Rainbow Six Siege coach and player, I've navigated two highly competitive and dynamic environments. It seems to me that one of the keys to rapid and significant improvement lies in a concept known as intentional practice. This approach, focused on targeted and mindful effort, has been instrumental in not only advancing my own skills but also in elevating the abilities of the players I've coached.
Transitioning these principles from gaming to the realm of software development has been a fascinating and enriching experience. Intentional practice is a methodology that transcends the specifics of any single field, highlighting the universal value of focused and deliberate practice. In this blog post, I aim to explore what intentional practice is, and how I plan to continue leveraging it to help drive my growth in the world of software.
The Power of Intentional Practice
In the world of esports, intentional practice is a cornerstone of success. As a coach, I've seen firsthand how players who adopt this approach are able to accelerate their skill development and achieve remarkable results. The concept of intentional practice is simple: whenever you're performing an activity which you aim to improve at, you should be performing that activity for a reason. That is to say, it's critical to focus on small and incremental improvements, and to never waste effort by doing something without growth in-mind. By carefully planning the why and the how instead of the what, you can make the most of your practice time and achieve significant growth.
As a field, software development is no stranger to the concept of practice. Engineers often engage in continuous and often self-directed learning by building apps, solving problems, and all host of other things in order to improve their ability to recognize and solve problems. The idea of intentional practice, however, takes this a step further. It encourages you to be more mindful and deliberate in your approach, rather than simply building an app or solving a problem. According to it's doctrine, you should evaluate why and how you're going to build it in addition to what you hope to learn from the process. This enables you to goes beyond simply writing code for writing code's sake, and instead encourages you to think critically about what you're doing.
Let's consider a hypothetical scenario to illustrate the concept of intentional practice in the context of software development.
Imagine you're a developer who's working on building a website where you'll host your personal blog. As a developer with extensive experience building web applications with large frameworks, you could very likely rapidly build a functional blog site without much effort. You've built small & large web applications, thought about the user experience, and have a good understanding of the technologies you'd use. You could easily build the site without much thought, and it would likely be a perfectly functional blog.
Doing so, however, would be a wasted opportunity for learning and growth when viewed through the lens of intentional practice. You already have the skills to build the site with ease, so the act of doing so wouldn't provide much in the way of skill development. It would be like a trained carpenter only building birdhouses in their spare time; while they might be able to build a birdhouse with ease, they're not learning anything new by doing so.
Instead, you could approach the task with a specific goal in mind. Perhaps you could aim to build the site without using any large frameworks, instead opting to use only vanilla HTML, CSS, and JavaScript. This would not only force you to think critically about the technologies you're using, but it would also provide insight into where you might be using large frameworks as a crutch.
I think that this is a good time to mention that there's nothing wrong with building a blog site, or a birdhouse, or anything else for that matter just for the fun of it. The point of intentional practice is not to say that you cannot build something for fun, but rather to say that if you're looking to improve your skills then building something for just fun might not be the best way to do so.
How to do Intentional Practice in Software Development
The concept of intentional practice goes beyond simply setting a goal for a specific task; while this is an important part of the process, it's not much different from just working on a task with a clear objective. Instead, you can think of intentional practice as a more holistic approach to building skills.
In the context of software development, I think that intentional practice can be broken down into a few key steps which are undertaken throughout the lifetime of a project:
Identify something you'd be interested in working on; this will ensure that you're motivated to continue working on the task, even when it becomes challenging. Maybe you're interested in Sudoku, and you'd like to build a Sudoku solver!
Come up with a clear path to implementing the thing you want to work on. For the Sudoku solver, you might start by considering what sort of algorithms you'd need to use to solve a Sudoku puzzle, and what sort of experience you'd like to provide to the user (a CLI? A web app?, etc) and how you'd build that.
Consider what you could add to the project to put it outside of your comfort zone. Maybe you've identified that it would be straightforward to build a Sudoku solver using a guess-and-check style backtracking algorithm. You could instead opt to build a solver which attempts to solve the puzzle within the constraints of the rules of Sudoku, preventing you from guessing and checking your way to a solution.
Solidify what you'd like to learn from needing to solve around those factors. In the case of the Sudoku solver, you might be interested in learning new data structures and you think that you could use a graph to represent the Sudoku board and solve the puzzle that way. Alternatively, you might be interested in learning how to efficiently stream data from a web server to a client, and you could build a web app that solves Sudoku puzzles in real-time.
Start building your project! As you work on the project, you should be mindful of the goals you've set for yourself, and you should be open to adjusting your goals as you learn more about the problem you're solving. During the process, take explicit time to reflect on the outcomes of your work, and what they imply about your growing understanding of the problem you're solving.
Finally, once you've completed the project, you should take time to reflect on the process you've gone through. What did you learn? What did you struggle with? What would you do differently next time? And most importantly, how can you apply what you've learned to future projects and to your mindset as a developer?
The topic question: Why does this blog-site exist?
I've built this entire blog site with a few goals in mind, however the one relevant to this post is that I wanted to become much more explicit in my implementation of intentional practice.
I've often found that while just reflecting on my work and my learning has been very useful, spending time to discuss those reflections with others has been even more useful; much like the idea that teaching something is the best way to learn it.
This blog-site will allow me to not only reflect on my work and my learning, but also to "call my shots" and make my goals explicit at the outset of a project. I hope that by doing so, I'll be able to even more effectively leverage the power of intentional practice to drive my growth as a developer.