I know there are some things about Software Development I really like, while there are other parts that I really don't like. I've often wondered, mostly as fleeting thoughts lost in the bustle of a work day, what causes the difference. Why do some days just fly by, and I can code for a solid work day, and get home and all I want to do is keep coding? Why do other days drag on and on, and I can't wait to be done?
I was glancing through Chapter One of this book (can read online for free) and this paragraph crystalized some thoughts around this. I really like inventing worlds.
"Every other science deals with the universe as it is. The physicist's job, for example, is to understand how the world works, not to invent a world in which physical laws would be simpler or more pleasant to follow. Computer scientists, on the other hand, [do]."
That's why starting new software projects is so fun for me - when you lay the groundwork, you are inventing a world. You're composing the natural laws for a new universe. The abstractions you create in code become its atoms and molecules.
Not all universes are created equal. If you don't do a good job creating your universe, it will become overly complex and difficult to operate in. If you do a good job, you can create something like The Architect of The Matrix describes:
"The first matrix I designed was quite naturally perfect, it was a work of art, flawless, sublime."
It's the world creation part I really enjoy. It's where you can "listen to the code tell you what it wants to be." Generally a new software project has a lot of that up front, then over time it transitions to a more "construction" phase. The opportunity to create new abstractions (new types of atoms and new natural laws) never completely goes away, but it does diminish. Projects where the opportunity for that level of creativity is lowest are the ones that are the least fun for me to work on.