Coming from an engineering background, I have seen the issues that well meaning engineers encounter when attempting to develop software.
- Inappropriate technology or language selection
- Poor architecture and strong coupling between components
- Inadequate or non-existent testing
As a result they often spend much of their time fighting with the software instead of solving the design or research problem. Additionally, the reuse and extensibility of the software is limited, resulting in significant rework.
Software Carpentry provides an excellent online course based on Open Source content intended to give scientists and engineers the fundamentals of software development.