Use the right tools. The best way to find out what tools work for you is to experiment with them, and throw away the ineffective ones. The right tool for the job is not necessarily the programming language you already know. When using a language, you re limited to what that programming language can express. Design to interfaces.
Interfaces produce a much cleaner design.
This not only gives you implementation language flexibility, but lets you completely partition portions of the project. If you decide to implement part of the project outside your group or company, the clean interface prevents any undue coupling with the rest of the project, and you can develop it in any language. Also, you may decide to use rapid prototyping to implement all the interfaces, and later optimize particular ones as appropriate. Design with exceptions. There will always be mistakes in either design, coding, or module use, and unless the software itself announces those mistakes by throwing an exception, you will spend hours or months hunting for problems.