Working on software separate from work is an excellent way to learn, explore passions, and follow ideas. I started my career in computing with personal projects, and I continue to build and expand my skills with my own projects. Even though these projects are fun, they include many components of an enterprise project. Two of the most important pieces for success in any kind of project are organization and testing.
One challenge with personal projects is context switching. Working on projects for short bursts between other priorities makes it hard to keep track of progress on different features. One way to counteract this is breaking down scripts into the smallest responsibilities possible. The goal then is to look at something and be able to quickly understand what it does and what things are connected to it.
For example, a player object in a first-person shooting game has a movement script, a script to shoot with, and a control script to contain information about the player. In a game, I took inspiration from a talk given by John Romero from ID Software. He suggested using gyms as a way of testing aspects of a game in a controlled environment.
In Unity, I will build scenes that are each dedicated to a specific feature. For instance, for a simple first-person shooter, like Call of Duty, there might be a movement gym, a shooting gym, and an objective gym. Each one should have all of the interactions that occur in the game. For example, the movement gym should have hills, obstacles, and other objects to run into and make sure all the interactions resolve as expected.
In the next section, you’ll notice these line up nicely with the gyms used for testing. This is done purposefully so that, when building a new feature, there is a clear location to perform testing and code updates.
Testing is a primary source of confidence for a project. While it’s not the most motivating task, a testing suite displays which parts of the project are under construction. With side projects, there are inevitable distractions that lead to periods of inactivity. Running tests and looking for errors and failures is a way to see instantly which features need attention.
Here is an example; when working on side projects in Unity, I will build scenes that are each dedicated to a specific feature. Then when I take a break and come back to the project, I will spend 10 minutes running each scene to make sure everything runs as expected. If a scene feature fails, then that will jog my memory about what I was working on. I can now dedicate more time to solving new problems and building new features instead of crawling through the codebase looking for work.
Making Progress on Personal Projects
Testing and focusing on code organization makes seeing the progress on personal projects easier. Testing allows focus to shift to developing new features and solving new challenges instead of resolving old ones. And, in turn, new challenges and features keep working on personal projects fun and rewarding.