Ever change a tire? How much work is it to carefully wrestle a wheel onto its car mount, avoiding banging the calipers or rotors? If those wheels are nearly a foot wide, 27 inches in diameter, and weigh nearly half of what you do – quite a lot! Faced with the problem, I bought a wheel jack – Dolly. With the car on jack stands, Dolly works perfectly to remove one wheel, move it, place another wheel on the Dolly’s rollers, align it to the mounting bolts, and gently place the wheel on the car. This simple tool makes the whole job of swapping tires much less of a chore.
Normally, four wheel jacks are used to lift and move a car. This can be handy if you’ve removed the engine, or if you have a large garage and want to tuck the car a corner for storage. Seeing wheel jacks in use, however, gave me (and apparently many other people) the idea to use one to change tires. Using a single wheel jack to change a tire isn’t the primary use case, however, once you’ve done it, it seems obvious – but my dad, who first taught me about cars, never showed me the trick!
Having learned a trick that works for this job, is a wheel jack the right tool for all jobs? Of course not. Just as there is no one tool for every job, there is no Excalibur to make you Ruler of All Great Projects. Rather, if you know process groups and knowledge areas well, and therefore how to effectively run a project, you can decide what to optimize for in your projects. In software, the quest is not for “the single, best software development practice for ALL projects”, but rather “the single, best software development practice for THIS project.”
Think of it this way – knowledge is your tools. Knowing how and when to creatively use tools to best effect is what makes a craftsman or artist. The process of sizing up the problem provides the insight on how to resolve it. When organizing a development project, it is essential to understand the requirements and constraints, both from your organization and your customers, and then create the best development practices for that specific product and project. Sounds a lot like business analysis, doesn’t it?
Let’s consider organizational requirements and constraints. Two areas to consider is what the PMBOK® calls “enterprise environmental factors” and “organizational process assets.” Enterprise environmental factors are the company culture and existing systems that the project can make use of – or will have to deal with. You could substitute the word “baggage” and get most of the idea. “How we’ve always done it” might help or hurt your project, making it essential to ask questions and review basic assumptions. Organizational process assets are existing process, procedures, and historical information – do you have a bug tracking database you can review? A build system already in place? Other projects to compare? Can you take advantage of process assets to benefit your project? What assets could your project contribute to others?
Think about your development team. Is it one developer or hundreds? Are they in one place or geo-distributed? How many languages and cultures are involved? Is it one unified team or many disparate teams with different managers and goals? Is the team fixed for the duration or the team members rotate and change over time? Is a single company or many companies involved? The team and resources available shape the development project, and shape when and where you’d use traditional or agile methodologies. Planning to use Scrum in a large monolithic, complex, tightly coupled and not well-documented Version 1.0 design with a global team of hundreds across multiple companies? Well, have fun storming the castle!
Customer requirements and constraints are the other influence. Customer requirements will not only define the product, but how you produce it. Whether your product is an embedded system or a cloud application dramatically changes how it can be serviced. Is the product consumer or enterprise? One user or hundreds of millions? Single installation or high volume on many platforms? Are there legal or industry (healthcare, finance, government) considerations? Is the software free or cost millions of dollars? Is the product a simple game or mission critical avionics? Answers about customer requirements for your product will inform how to optimize your development process. Reliability/quality vs. velocity is an important balance, and needs to be determined by customer expectations and use cases. Software quality issues can be trivial. The “exit seat position” feature in my car has an “arrays start a zero!” bug – it means the seat doesn’t quite return to preset driving position, so I don’t use the feature. For another application, however, software quality issues can be extremely expensive – or even deadly.
There are gotchas in the process. Micro-optimization can cause poor decisions. If the company produces a million cars, and instead of using a $2 switch per car, you substitute a $1 switch, you’ll get a pat on the back for saving the company a million dollars. If, however, those $1 switches have a MTBF of one year, instead of ten years for the $2 switches, you will cost the company three million in warranty costs (assuming the cars have three year warranties), plus reimbursing dealership labor (which will easily bury the cost of the switches). Also, data-driven decision making can cause difficult-to-metric costs to be ignored or trivialized. Loss of customer trust and goodwill can be devastating, but hard to quantify.
To summarize, project management knowledge is common regardless of the project – but the techniques and details of execution in software development can be very different. Traditional or agile, know the fundamentals, then make intelligent optimizations to meet business and customer goals.
For another take on this topic, read “The Right Way to Ship Software”. For a story of development gone wrong, read a story about a video game. You, like me, probably have some genuine empathy for those folks, along the lines of “Oooooh, ouch, yeah, I remember something like that.”