Насчет крешей и зависания, добавлю:
1. Не использовать многопоточное программирование без четкого обоснования, что это дествительно нужно.
2. В каждом языке есть свои особенности, влияющие на стабильность. (То что в си приводит к к крешу, в php может оказаться всего лишь "notice").
Насчет ошибок проектирования.
Есть понятие
антипаттерн , описывающее многие распрастраненные ошибки.