Software Mistakes and Tradeoffs: How to Make Good Programming Decisions