I think a lot before I do anything, and once I do something, I’m not afraid to throw it away. It’s very important that a programmer be able to look at a piece of code like a bad chapter of a book and scrap it without looking back. Never get too enamored with one idea, never hang onto anything tenaciously without being able to throw it away when necessary; that should be the programmer’s attitude.
Don’t bind early; don’t ever make decisions earlier than you have to. Stay an order of magnitude more general than you think you need, because you will end up needing it in the long term. Get something working very quickly and then be able to throw it away. Learn from small experiments rather than large ones. Don’t go into a two-year development with nothing coming out in the middle. Have something come out every two months, so you can evaluate, regroup, and restart.
The trick is to learn from the Hewlett-Packard approach: Keep it as twenty different, small companies. Keep breaking it up and never let it become a huge organization, except at some level that nobody cares about. In terms of working relationships, keep the number of people small and their focus localized, project-oriented, so they can work at their best.