Stephen Hara

Driving Software Projects

Published on 12/7/2024

  • post
  • career
  • software-development

Driving projects is a lot of work. There's a lot of stuff to do, stuff to think about, and stuff to navigate. If you haven't led many projects before, I hope you'll enjoy this post where I share my process!

The Steps

In general, a project will go through a lifecycle something like this:

  1. Identify a problem, pain point, or other inefficiency
  2. Ideate some solutions to the problem
  3. Draft a concise design doc explaining problem and ideated solutions
    1. note this should be stakeholder or customer focused - they're the ones who have to use your solution
    2. note this should be iterated on with near constant feedback, like 1 person/day
  4. Build any prototypes necessary to prove viability of solutions
  5. Present the design doc to a group who can meaningfully approve a solution
    1. "Meaningfully" meaning someone can consider the decisions about personnel, timelines, budgets, and so on
  6. Work on the approved solution (this is the easy part)
  7. Ship the approved solution!

All told, roughly 6 phases for a project, 7 if you include the impetus.

Cool - let's get into it!

Identify

The project needs a purpose in order to be valuable. This could be basically anything, but critically, it has to be important to somebody.

Does a product take too long to run a common use case? Are your systems failing unexpectedly? Can your users easily interact with your systems, or is it only error-prone, slow, manual processes to use them?

It's possible you can identify these just by doing your normal work duties. I think it's far more effective, however, to have lots of conversations with people. People love to vent, and frustrations are a great way to get a pulse on what could be improved.

Remember not to fixate on a problem before validating a wide enough impact! If you're the only one who thinks it's a problem, you won't get very far spending energy trying to convince others - and you would probably fail at that. There are plenty of problems to work on, so work on the big ones.

Also consider who agrees with you that the problem is a problem. If your whole team thinks something is a worthwhile problem, it probably is. If the CEO thinks something is a worthwhile problem, it almost certainly is! Though meeting the CEO frequently probably isn't easy, so you can aim for a couple levels above you instead.

Ideate

Once you've found some comrades who agree you've found a problem, come up with some ways to solve it. These should be rough ideas, and at least theoretically viable. This step is a good opportunity to do some shotgun googling, and if you're on a cloud platform, you can dig around the offerings to see what's new and possibly applicable to your other work as well.

It will help a lot to estimate a few things about each idea, such as:

  • How much time will this solution take to ship?
  • How parallelize-able will the work be?
  • How difficult is it to back out if the solution becomes unviable?
  • How maintainable is the solution?

The estimates will pretty much always be in relation to your team's composition, processes, and collective skills, so consider those variables as well.

At this stage, you should be talking to people! You can get fresh perspective on the problem and collect some extra ideas.

Draft the Doc

With your ideas in pre-crystallized form, it's time to start writing a design document!

There are an infinite number of approaches to this, and your company may have a template for design docs. I like to keep things as simple as possible, typically with sections like:

  • Background or context - why do we want to do this?
  • Scope - what are we going to accomplish?
  • Candidate solutions - what are the options available, and how do they compare? * The estimates from the previous step are helpful here!
  • Related systems - what other systems or teams could be affected by the outcome of this document?

There are a lot of examples of design doc guidance out there, but the best starting point I've found is from Will Larson's post on engineering strategy. Also, his book rocks. Tanya Reilly's book "The Staff Engineer's Path" also rocks.

I have one very important piece of advice to pass on for design docs. You should have a one-sentence central vision to any design doc you write. The scope and solutions should satisfy that vision. If someone asks why we're doing this, you point to that vision and read it verbatim.

Well, okay, don't be a dick about it. But you get the idea.

You definitely want to get some eyes on your document while you work on it to identify points that need clarifying or simplifying and other feedback. You also want to get several rounds of feedback, at different stages of the draft's progress, and ideally from a variety of people.

Prototype

Maybe your candidate solutions are nearly tied in terms of viability. Maybe you have a leading solution, and you'd really like to hammer the point home that it can work. Maybe you want to try something out before presenting it as a possible solution.

Some designs benefit from creating a prototype. This is a judgment call, but prototypes are great for clarifying the components of a solution, and validating that the concept of something works.

Decide

After a lot of iterating, feedback, and writing, you'll have a well-shaped document, almost all the obvious questions have been addressed, and the probability of a surprising and catastrophic revelation that shatters the fabric of reality the document was based on has been reduced to 0.

Now you get to schedule a 1-hour meeting with a bunch of people, most who should have read a past life of the document, and get them to fight over which solution you've proposed is the best. You should already know which solution will win, but just like in sports, upsets happen!

It is possible, but non-ideal, that one meeting won't allow for a consensus. This probably means you didn't have enough feedback sessions, or you didn't cast a wide enough net for your feedback. It's not the end of the world, but you really want to make sure you have some smaller sessions with the dissenters to figure out how to bring them on board.

Tragically, politics.

Build

The easy part is finally here - time to build!

I find it helps a lot to start by getting the termini in place, even if it does nothing in between. By that I mean, if you're standing up a new API or web app for example, get it to handle a request, send it to the business logic layer, and provide a response. Then automate that via testing or a repeating cURL invocation or something. Any discrepancies while you build will become immediately obvious, and it's more comprehensive than unit testing (which you should also do!).

Ship

Eventually, you will have completed enough building to Ship It! Check that it works in a Not-Your-Machine environment, double check, make absolutely damn sure it works (hopefully this is just a ./run_the_tests.sh invocation), and then announce it in whatever forum is appropriate!

Watch the party hat, hands clapping, rocket flare, and other celebratory emojis flood in, grab a coffee, do a victory lap, and do some push-ups.

Not too many, though. Because you'll need your arms for...

The Secret and Eternal Next Step

You deployed the project to great fanfare, and that is something to be proud of!

But the work is not done. Now the project is walking around, trying to drink cleaning products under the sink, and still needs diaper changes.

Well, the software equivalent, anyway. There are still more features to complete, feature requests to inbox, bugs to fix, pipelines to optimize, and so on. And for at least a while after your stewardship of the initial zero-to-ship stage is over, you'll probably still be involved, and even if not, you'll still be involved indirectly. You shipped it, so you're kind of the "go-to guy or gal" for it.

That might be a post for another day, though! :)

Other Reading

  • This post by Sean Greece is a great read on what exactly it means to "ship" a project from the perspective of the business folks

This page brought to you by Stephen Hara.