Sustainable Side Projects: Keeping Personal Code Alive
Most developers have a graveyard of half-finished side projects: a repository with three commits, a domain name nobody uses, a folder called "new-idea". Starting is easy. Keeping going for months, alongside work and life, is the hard part. Here is how to make side projects sustainable.
Know why you are doing it
The first decision is purpose, and it quietly determines everything else. Common reasons:
- To learn a language or technique.
- To solve a problem you personally have.
- To build something other people use.
- To enjoy making things, with no goal beyond that.
Each of these has a different definition of success. If you are learning, a project that teaches you a lot and is then abandoned is a win. If you intend to ship, you need a different level of discipline. Many projects stall because the author silently expected one outcome while working for another.
Shrink the scope
The most reliable cause of death is a scope that fits a full-time team. Cut ruthlessly:
- Write the idea in one sentence.
- List the smallest set of features that would make it useful to you.
- Remove half of them.
- Build that.
A tiny tool you finish and use is worth more than a grand platform you never launch. You can always add features to something that exists. A good model is the small framework experiment in the Tinyweb series, which stays deliberately modest so that it can actually be completed.
Make progress in tiny pieces
You will rarely get long uninterrupted evenings. Design the work for the time you really have:
- Break tasks into sessions of 30 to 60 minutes. Each should end with something working.
- Leave a note for the next session. Write down the next step before you stop, so you can start without rebuilding context.
- Keep a visible list of small, concrete tasks. "Add login" is vague; "write the sign-in form" is doable tonight.
Ending a session mid-task, with a failing test that describes what to do next, is a trick many developers swear by. It turns the next start into an easy first step.
Reduce the cost of starting
Friction kills momentum. If it takes twenty minutes to remember how to run the project, you will skip the session. Invest early in:
- A one-command build and run.
- A short README describing how to set up and where things are.
- Automated tests that tell you quickly whether you have broken something. Pay attention to testability from the start, perhaps with delegates as in funcy testing, so changes after a break do not feel risky.
- Version control with frequent small commits.
The aim is that after a three-week break you can sit down and be productive in five minutes.
Protect your energy
A side project competes with sleep, family and the day job. Burning out on it helps nobody.
- Set a rhythm you can keep. Two evenings a week, sustained, beats a weekend sprint followed by months of silence.
- Allow breaks without guilt. A pause is not a failure; abandoning without deciding is the real problem.
- Avoid the day-job overlap. If your work is all screens, a side project in a different domain can be refreshing.
- Do not measure yourself against others. Social media shows launches, not the years of quiet effort.
Choose boring technology where it counts
If the goal is to ship, use tools you know. If the goal is to learn, use one new thing at a time. A project that adopts a new language, a new database and a new hosting model all at once is three learning curves with no spare energy to deliver anything.
Automate the dull parts
Deployment, backups, formatting and dependency updates are chores that drain enthusiasm. Automate what you can, once. A small script now saves hours that you would rather spend on the interesting parts.
Know when to stop
Sustainability also means being able to end things well. Decide in advance what "done" looks like, or what would make you stop. If you lose interest, write a short note about what you learned, archive the repository and move on. That is a completed project, in the way that matters. What you learned feeds the rest of your craft, as discussed in how developers really learn.
A checklist
- Write down why you are doing it.
- Define the smallest useful version.
- Set up one-command run and a few tests.
- Work in short sessions and leave notes.
- Ship or stop deliberately.
Treat your side projects as long-term relationships rather than affairs, and they are far more likely to survive. When you hit snags that need isolating awkward code for testing, remember tools such as isolating code with Moles and Fakes, but keep them for the rare cases that need them.
More .NET guides
- Moles and Pex: Isolating .NET Code and Generating Tests (Now Fakes and IntelliTest)
- Building a Web Framework Is the New Black
- Funcy Testing: Using Func and Action Instead of Interfaces
- MEF: Making Extensibility Fun
- A Gentle Introduction to WCF
- Tinyweb Series, Part 1: Getting Started
- Tinyweb Series, Part 2: Building APIs
- Tinyweb Series, Part 3: Dependency Injection and Filters
- Tinyweb Series, Part 4: Views, View Models and Model Binding
- Tinyweb Series, Part 5: The To-Do Demo
- The Ordered Jobs Kata: Dependency Sorting with TDD in C#
- JavaScript: It's Up Your Sleeve
- C# News from the Future: What If...?
- What's After Unit Testing?
- The "If It Isn't Broken, Don't Fix It" Mentality
- Are You Failing Enough?
- Don't Bother Rewriting It: The Case for Gradual Refactoring
- Was Dave a Genius? Lessons from a Legacy Codebase
- Preston Tweetup: Why Developer Meetups Matter
- How Developers Really Learn
- Parallel.For and Silver Bullets
Looking for a software partner? Browse the independent directory of French tech companies (web agencies, IT consultancies, software publishers; the directory itself is in French).