Four months ago I became a father. My daughter’s birth changed my life in a million ways. Most of these are good (there’s nothing in this world that compares to your child’s smile), but it has also meant less sleep and especially less spare time. I’ve learned a host of new skills that are pretty different from the ones I hone as a software developer.
That said, the two domains are not totally unfamiliar. Here are just a few ways working on a software project is like being a parent.
You get used to changing requirements.
What babies need and what software projects need can change in the blink of an eye. Six months in, it turns out rocking your baby to sleep isn’t cutting it anymore — she needs her favorite toy and for you to sing a song to her. That’s not all that different from working on a web app that takes off, and suddenly you need to worry about things like internationalization and bandwidth and Facebook login. In no time at all, you’ve gone from milk to solid food.
Babies and code both have smells.
Okay, so code ‘smells’ are more metaphorical, but neither baby smells nor code smells are terribly pleasant. In either case, the smell indicates a problem which you ignore at your peril. For software this means refactoring, and for a baby it means at least a diaper change. For really bad smells, it may require refactoring in the form of a change in diet.
You need to balance your budget.
Having babies is notoriously expensive. You have to make tough calls on what you do and don’t need. Does he really need that shiny new bike? And if he does, how can you get it for less? (Craigslist, amirite?) It’s just the same with software projects, especially when you have a fixed budget like Atomic projects do. You have to cut features that are unnecessary and creatively find ways to deliver value for less. And be careful not to take on too much debt, whether technical debt or on your Visa card.
You learn to take a long view.
Babies and software projects require constant attention to long-term consequences, and a certain moral determination to do what’s best for the baby/application. There is no cutting corners. This might mean enduring whining when you make your children learn to entertain themselves, rather than popping in “Finding Nemo” for the four-hundredth time. Or it might mean spending a day racking your brains trying to cone up with an elegant mechanism to get data from point A to point B, instead of using global variables. In both cases, you do the hard thing now in order to avoid problems down the line, because you care about the end result more than your immediate comfort.
Don’t go it alone.
They say it takes a village to raise a child, and the same is basically true for software development. Even on a “solo” project, the customer always has a crucial role to play. Not to mention the value of soliciting the advice of co-workers (neighbors), or the myriad insights of Stack Overflow. And as I’ve discovered, these days raising a child and writing software both involve a lot of Googling when you can’t figure out what to do.
You have to let go.
One final way being a parent is like working on a software project is that strange mix of pride and anxiety which accompanies sending your child out into “the world.” You’ve done everything you can to ensure success, and it is time to let your darling child stand on his or her own. It’s a dangerous world out there (thieves, high speed car crashes, heartbleed, DDoS attacks), and you just have to trust that what you’ve done will be enough.
You’re never completely done being a parent, though. We all know sometimes kids come back home for a while after college. And sometimes at Atomic we pick back up on a project that’s been out in production for some time. In both cases the goal is usually to get them re-equipped for success and self-sufficient again as soon as possible.