- fear or lack of understanding of a legacy codebase
- fear or lack of understanding of a 3rd party component
- time pressure
- too many edge cases to handle
- intra-team communication issues or stylistic differences
- lack of domain experience to understand those edge cases
- lack of time to build the correct design, or rebuild a design if it won't fit
- project management pressure against big-design-up-front and to "start now" when making something more organized is required
- unclear requirements
- not interested in work or company anymore
- lack of use cases representing all possible usage scenarios
- it's actually not their code that was bad, but they are coupled to bad systems that are themselves bad/leaky/error-prone