The saboteur's guide to software projects
Hello, Iām Kristof, a human being like you, and an easy to work with, friendly guy.
I've been a programmer, a consultant, CIO in startups, head of software development in government, and built two software companies.
Some days Iām coding Golang in the guts of a system and other days I'm wearing a suit to help clients with their DevOps practices.
Table of Contents
One of the funniest reads for large orgs is the declassified "Simple Sabotage Field Manual" (1944): the CIA (then OSS) guidelines for the Resistance on underhandedly destroying productivity.
A few years back, I took a sharpie and highlighted for a friendly client which destructive ideas (especially in chapter 11) are deeply ingrained in their corporate policies and culture. š
Based on that, let me introduce the "Saboteur's Guide to Software Projects": a tongue-in-cheek playbook for 100% guaranteed project failure.
The list is open to contributions ā feel free to share your evil suggestions below!
Failure-Seeding Planning #
The planning phase sets the foundational traps that will detonate later.
- Always insist on making software projects as large as possible. Nothing is out of scope.
- Point out that some agile projects also fail, and so insist on doing waterfall. Blame outside factors (procurement, budgeting, etc).
- Insist that the software can be only launched to users when every last part is ready.
- If someone insists on at least phases/milestones, make sure that no actual software gets released: make the milestones about "deliverables" which are documents.
Requirement-Minefield Specs #
Requirements are perfect for planting further landmines.
- Find people who believe they know what the end user needs (project managers, bosses, etc): let them specify, so half the actual requirements don't get specified.
- If you must have the real end users specify, then insist on detailed specifications, in writing, before any code is written. They will specify only the business functionality, and completely forget about the parts they don't see, like interfaces, user administration, monitoring, backups, etc.
- Over-specify some things that are actually incredibly expensive to implement, like 100% uptime.
- Use a lot of vague expressions like "immediately", "user-friendly", etc.
Division-Sowing Organization #
Project organization is your foundation for inflicting delays ā primarily by increasing handovers: create as many independent-but-not-autonomous parts as possible, so none can achieve anything without coordinating with others.
- Bring in consultants to help organize the project. Don't start anything before their recommendations are ready.
- Establish at least two management forums with different agendas where the project will be discussed regularly. There should be as little personnel overlap between the forums as possible.
- For other software systems that your project interfaces with, demand weekly status meetings, with as many participants as possible, for the whole duration of the project.
- Make sure that only managers attend these status meetings and enforce a strict agenda, to avoid accidentally creating a forum where technical people can discuss technical details.
- Do not disseminate important information in topical channels but rather only in direct messages, and only to half the people whom it might concern.
Morale-Crushing Development #
Development is hard to sabotage with a good team ā so crush morale instead.
- Even if parts of the software are ready, do not release them to real users.
- Insist that developers come into the office all the time, and make sure the office provides as many distractions as possible, preventing deep work.
- Insist on documentation as early as possible, possibly in advance. Discredit other, less expensive methods of information transfer as "not serious".
- Don't do automated tests, insist that they slow down development and make refactoring harder. (Nevermind that you don't actually allow time for refactoring.)
- Strict firewall rules! Require detailed documentation and approval for every port opening request. (Firewall openings only on Wednesdays.)
Endless-Testing Nightmare #
At this point the software is "feature complete", and stakeholders assume that it's nearly ready for go-live after a quick testing round.
- Actually, since the software has never actually met the reality of the end users yet, it will be full of wrong assumptions, missing critical details, and big parts will end up never used.
- Try to still delay putting the software into the hands of the end users. Other people (managers, testers, etc) who believe they know what the end user needs should do acceptance testing.
- This phase allows for a lengthy and many-rounds manual testing and fixing death loop that can last for months.
- This is the phase where the inadequateness of the initial specifications will come to light. Nevertheless, label every change as "bug" (not "change request") thus destroying the team's morale further.
- Delay paying suppliers until your huge pile of "bugs" (actually change requests) are 100% completed. Their bosses will run after their money, and so make their teams implement your changes cheaper and cheaper ways, thus letting you lower overall quality to the rock bottom.
Knowledge-Destroying Ops #
In this phase, your focus should be on destroying know-how and cementing the project into an unchangeable state.
- Make sure that the software is operated by people who were not involved earlier. If you have a dedicated OPS team who doesn't DEV, that's perfect.
- Immediately let go of any suppliers, and spread every internal developer out to different projects.
- Double move: Fire some key people now (thus destroying knowledge) who you can later scapegoat for the inevitable failure (thus securing your own position).
- Leave behind immense amount of useless and misleading documentation. Your earlier documentation will help a lot here, it's guaranteed that all of them are out of date.