1. Never build up trust in your team or with your developers. You do not want a developer to go rogue and be trusted to work on what he wants, or how he wants to. This can cause devs to work on things you didn't expect. You also do not want to trust engineers with their problem solving and approaches. Every change should be criticized and validated by a host of other developers, including non engineers.
2. Isolate engineers to pods and minimise collaboration across teams. You do not want developers to easily work together across teams. It is best if your senior engineers are limited in providing impact to the sub team they are part of and nothing else. Ensure developers cannot offer ideas, solutions or insight on anything outside of their team.
3. Disallow experienced engineers to work on things they want to. Prevent any sort of rogue engineering or anyone that wants to improve or fix something out of pure choice. You should entirely stick to a rigid schedule that is driven by management and the release cycle and do not let engineers influence or manipulate this plan.
4. Hire as many low skill junior engineers as possible, but provide little to no guidance as to create as many bugs as possible. Bonus points the more time they consume from experience developers on the team. It also works really well when you hire engineers for a role and then have them work on a different part of the tech or a different project entirely.
5. Never value senior engineers and your 'old timers', the people who have all the knowledge. This is bad, the faster you can cycle new devs the better. We don't want anyone to build up too much knowledge of the code-base and become a gate keeper (don't get me wrong this actually can be a real issue, but honestly you should value your senior and old timers at all costs).
6. Make sure code reviews cause a huge road block, question every change and force developers to constantly be trying to keep up with the ever changing guidelines, peoples' opinions and the goals of the project.
7. Ensure your build architecture is as slow as possible, you don't want people working too fast. If you have automated tests set up, make sure they are super flaky and break on random platforms, this makes sure to keep your devs on their toes and be on the look out for problems.
8. Never let your engineers become leads or managers. We want to make sure all leadership and project decisions are from non-tech people. This way we can control the engineers who have no clue how business or project management works. Extra points if you regularly cycle out new managers and leads who are new to the project AND have no tech experience.
9. Make sure that all work requires full design documents that have gone through approval from everyone on the team. This works best when the design is vague, forcing engineers to create the doc without knowing the full constraints, and then we can control them best by adjusting the design and showing that their solution will not work for the requirements. Bonus points if your design is driven by one or two people, who live in a different time zone and are hard to get a hold of. Even better if they aren't closely associated with the project and are not up to date with what the best design choices even should be.
10. Regularly reschedule your team structure, hierarchy and all the devs. You don't want anyone getting too comfortable. Moving teams, entirely changing teams, resizing teams and changing team priorities are all great ways to keep your engineers engaged and interested.
11. Limit all engineers to tiny PRs so that refactors and larger changes happen over many commits. Smaller PRs are easier to review and so it's better if chunks of work go into main bit by bit, and then we can do full test runs, QA checks and perf testing on every small change. This works well so that if engineers leave the project part way through a collection of work items, the part way done work is already there and ready for others to pick up and finish of (and definitely not get left unfinished in the project forever).
12. Regularly discuss and evaluate naming for features, projects and code files. This includes naming semantics/conventions. It's best if you regularly modify these conventions to keep up with changing times and new engineers' opinions. It is beneficial work time spent if you do large naming refactors, or even better is to do small commits to change the naming convention to parts of the code and then add a PR hook that breaks if you modify a file and don't update it to the new naming convention.
\s Tongue in cheek, if it wasn't blatantly obvious..
Disclaimer:
This is just a fun thought exercise and the points are just a collection of personal thoughts.
They are not reflective of my current employment nor any company I have previously worked for.