A plan is not only good for business

The good: When as a developer you have a clear roadmap and an perfectly well described set of requirements

As a developer, one of the things that really keeps me motivated is to know where I'm going.

This means that the short and medium term objectives are clear (by whoever might be in charge of gathering requirements or making the specs), and in a somewhat detailed way.

This makes it possible (again, as a developer) to make your work flow from one day to the other in a more natural way, mentally planning what you want to accomplish "today" in your trip to the office, and plan "tomorrow" as you work your way to the end of the day (and maybe also in your way home), in a some kind of intimate stand up meeting with yourself that never ends.

For me, this is absolute happiness, and a high morale boost, since I feel productive, useful, and i'm "in the zone", the king of my domain.

I have control over my work, day by day, and this leads to also have control hour by hour, and maybe, over the whole week. I can predict the outcome of my work for the next couple of days, and cut on the surprise factor. Things happen fast.

Of course this also reflects in the code, which seems to pretty much mutate into the right form by itself, or even guide me in the way that I should be doing things. Every change seems natural, easy, and like the next logical step towards the goal. TDD is possible and refactors are a breeze.

This is what makes you go to bed thinking about the wonders you will do tomorrow, and get up early in the morning, have your breakfast eagerly, and take that dirty, noisy, and crowded bus, train, or subway to the office with a smile in your face.

The bad: And what every developer hates, a set of vague and ambiguous requirements for your software

On the other hand, when specs are too vague, ambiguous, or you have to discover (or help discover) them as you code, or when they are too broad, or have lots of copy&paste, or sounds like the first thing that popped in someone's head, or they seem odd, you know you're in for a ride. And probably a nasty one, filled with insecurities, delays, and fear.

Insecurities because you won't be sure about the final shape that your code will (or should) have, and you're not sure if the paths you're following to try to reach the objectives will still be useful tomorrow. You are not even sure about the objectives, and you are uncertain about the details for your most immediate deadline. This is completely demoralizing. And worst, it doesn't even feel like it's your fault.

Getting to the office without a plan is a pain. Since you are not sure about what you need to do, or you are waiting for answers for your questions yesterday, maybe you will take a little more time to plan the next step, and very possibly wasting useful time along the way (as you know, the internet is very good at providing distractions for a not so motivated employee).

Days like these makes you want to go home early, and wake up troubled because you have a deadline near and no desires to continue working in such a messy scenario, although you continue to. Progress is slow. Since there are no clear objective or details, the code does not look like anything in particular, but just a collection of different stuff, glued together only by a root source directory, waiting for the final specs. You don't really want to work with that code, the big ball of mud starts to grow. You feel more like doing or researching something else for yourself, where you can actually control things.

And this might be even be happening in a "cool" project.

The ugly: As a software developer you have to be prepared to handle all scenarios

So what's the ugly in this case? The truth, the real world. It's rare to actually find "the good" and not "the bad", or viceversa. Actually, it's possible that you experience both things in turn, a few days of each. Let's face it, nothing is a complete a mess or a complete paradise (well, some things are a complete mess, ok). We devs will sure have to work on something that we might not be interested in, and businesses need to generate income. Such is the world we live in!

If you're a business owner, a stakeholder, or just the guy that has the idea, or vision: please make sure about your medium and long term objectives. Be sure about those, at least on the mainline. Be even more sure about the short term ones. Work with your clients, research the market, and gather the needed specs. Work with your project manager (or product owner) to actually come up with a basic plan for the first few months of work, and start working to plan the next few months while your devs are working. Give feedback, say things along the way, be present, try to correct things you don't like on site.

If you're a project manager or a product owner, please don't accept broad specs. Help in defining the requirements, think about the features (instead of just passing them to the devs), be realistic, defy unrealistic expectations. Work with your team, hear their needs, fight for them, answer questions quickly. Give them feedback, be present, show us (the devs) that you work just as hard as us. And please, oh please, give us a plan, a roadmap, with as many details as possible about the objectives. Weekly or monthly, if possible. With steps that will incrementally (and naturally) take the devs from nothing to a great product. Assign priorities, and understand our own priorities if they arise (like bugfixes or much needed unit tests or refactoring). Let us devs enjoy to work on our code :)

If you're a developer: be responsible. And relax. You're only responsible for the work that you commit to. You're responsible for not asking any questions you might have, or just ignoring problems or issues that you feel might come up because of the design or the current implementations. Don't be a fool, be smart about the time you use for things, give feedback, don't be afraid to say you're delayed, or made a wrong decision somewhere, or that you don't fully understand the requirements or objectives.

If you feel like you're experiencing "the good", let upper management know. Also let them know if you're experiencing "the bad". Be polite, try to always keep a cooperative attitude, try to help the guys upstairs and let them understand how it's like to be on the trenches (is it fun? is it boring? do we need more coffee?). Help your coworkers, try to have a good time while doing your job.

Final words: Understand your team, your boss(es) and your client(s) and focus on writing and delivering great software always

Whatever you might be, understand the other players, their needs and their jobs. Be honest and give visibility to your work. Understand that nothing is perfect, and we are all just humans having a bad or good day at the end.

Try to be cool and objective about your job: Are you happy overall with your responsibilities? Do you like your coworkers? Are you working on cool stuff? Have you learned anything new in the last few months? Are you becoming a better profesional? If you're not ok with the answers, you can always change jobs. But sometimes things are just circumstantial, and you only need a little patience and a positive attitude to get through the storm of dullness.

Sometimes devs are less motivated because we are doing the best we can with the specs (or resources, or time) we have, and sometimes we're just terrible bored doing a much needed task for the project and completely irrelevant for us, or we think it's out of the scope of a dev.

Sometimes the product owner is doing the best he/she can with the clients he/she has and still can't get a great spec to work with.

And sometimes the client needs a little help in discovering the final shape or features of a product but still needs a first version that will probably change in the future, because no one else has done something like it before, or does not have still enough experience in the field.

Some times, shit happens. And maybe this is ok some times. So just hang in there :)