Patrick's Software Blog

My Favorite Productivity Tip - Planning

Hand holding a pen and writing notes on a notepad.

Introduction

It's so natural to want to start a new software project or story by writing code, as it's fun to write code! However, this approach can result in a lot of re-work, starting over from scratch, or making mistakes that could have been avoided.

I think planning is an under-utilized tool in software engineering. For me, it's my favorite productivity tip for any software-related work.

Planning means writing out the steps needed to complete a piece of work. I find it very powerful to think out all the steps necessary to complete a piece of work, as it makes you realize the full scope of what is likely needed to complete the work.

Planning applies to:

  • a whole project
  • a piece of work within a project (i.e. a story as part of an Agile process)

This blog post focuses on a whole project but can be easily applied to smaller pieces of work.

Benefits

Planning adds discipline to the software development process, as I hate getting into a state where I'm trying out different ideas and just feel like I'm spinning my wheels (working but not making progress). It can be really difficult to make progress when you don't have a clear list of tasks.

Once you have a plan in place, it's a great feeling to start checking off small tasks as completed. Seeing items checked off in your plan builds momentum to continue getting more work accomplished and it's easy to see that you're making progress. By creating a detailed plan of what needs to be accomplished, it sets you up with a higher chance to finish the project. It's so easy to start a project, but it's really difficult to FINISH a project.

The biggest benefit of planning for me is dealing with procrastination. When I'm procrastinating, I find it so much easier to work on a small task than to feel overwhelmed by a large concept to work on with little details thought out. It's easier to check off a single task on a to-do list, especially when you're struggling to even start.

Tools

Everyone has different approaches for creating to-do lists; I think you should use whatever tool makes planning easiest.

A piece of paper and a pencil are a great approach. A text file that lists out tasks is a great approach.

I enjoy using Bear for all of my note-taking and creating lists. I have a MacBook Pro and an iPhone, so the synchronization across these devices is a nice feature that I appreciate.

Markdown format is familiar to me and I like the visual representation of the Markdown in Bear:

Bear App - Screenshot

Process

Writing out tasks feels like going through a project/story for the first time, then actually doing the work is the second pass through where you get even better clarity on what needs to be done.

My process of planning occurs in 4 steps:

Software Planning Steps - Diagram

Philosophy

Two of the most common software methodologies are Waterfall and Agile.

I've used both approaches and I try to utilize a hybrid approach.

The start of my planning approach is a Waterfall approach, as I come up with the major tasks for the whole project and plan out the detailed steps for the first few major tasks. After this initial phase, I shift to an Agile approach with frequent planning and focusing on working software throughout the development process.

Step 1 - Goals

Write down the goals (1-5) of the work ahead... why are you doing this work?

Step 2 - Major Tasks

List out the major tasks that you think will need to be completed to finish the project/story. This step is also a good time to start thinking about the areas that will require further investigation or may be the challenging aspects of the work ahead.

If you're working on a full project, make sure to include design work at the beginning! Even sketching out a basic idea of what you plan to build is beneficial to see how to complete the project/story.

Step 3 - Detailed Planning

List out the detailed tasks that need to be completed for the first few major tasks. This step is the most challenging and time-consuming of the planning process.

Also, remember to include investigation tasks when the detailed tasks that will need to be taken are unknown.

Step 4 - Execute and Re-plan

Start working on the first few major tasks that have detailed tasks, but be comfortable stopping to re-plan. Updates to the plan are expected!

Once you finish a detailed task, mark it as complete to feel a sense of accomplishment and to show that progress is being made.

Before starting a major task, make sure to go through listing out the detailed tasks.

Let's walk through an example of a Flask project...

Planning Example

I'm working on a new Flask project that does not use SQLAlchemy, but uses SQL commands directly using psycopg2. Here's how I have planned out the project.

Step 1 - Goals

First, I come up with the goals for the project, which helps solidify WHY I am working on this project:

Step 1 - Writing Goals

Step 2 - Major Tasks

Next, I come up with my initial list of the major tasks that I think will be needed to complete the project:

Step 2 - Writing out the major tasks

This listing is what I think will need to be accomplished, but I know there will be changes to this set of major tasks as I start working on the project.

Step 3 - Detailed Planning

Coming up with detailed tasks is the challenging part, because it is very time-consuming and it can be difficult to envision all the small steps needed to complete a project. I think this is where planning shines, as this detailed planning is a first walk-through of how the project will unfold.

I start by coming up with the detailed tasks for the design tasks:

Step 3 - Writing out the detailed tasks - Design

I also come up with detailed steps to get the initial project working, including initializing a git repository and getting the test environment working:

Step 3 - Writing out the major tasks - Implementation

It may seem like too much detail, but just wait until how quickly these tasks can be accomplished after thinking through all the details already.

I've planned out the detailed steps of the first 3 major tasks.

Step 4 - Execute and Re-plan

Time to execute... once a detailed task is completed, mark it as completed. It may feel like a trivial step, but it helps build momentum and keeps track of progress:

Step 4 - Execution and marking tasks as completed

After creating my initial plan, the process of drawing out the web page concepts made me realize that I wanted to be able to display the book covers. I decided to add an INVESTIGATE step to figure out if there was an external API available for retrieving book cover images. Re-planning is an expected part of the process!

Once I finish the first three major tasks (i.e. the ones that have detailed tasks planned out), I will need to plan out the detailed tasks for the next major task before actually starting to work on it.

At a minimum, your software project should be working (tests passing and able to demonstrate functionality that has been implemented) at the end of each major task.

Conclusion

This blog post describes the planning process that I go through with my software development work. Planning has been very beneficial for me (both at work and on my personal projects) for two key reasons:

  1. It helps me overcome procrastination, as I find a lower barrier to work on a small task and then gain momentum.
  2. It helps me finish projects, as I have a detailed plan to get to the finish line.

I hope this blog post inspires you to utilize planning for your software projects.