There are two types of complexity in coding: essential complexity stemming from the problem itself, and accidental complexity from things like frameworks and programming patterns. Accidental complexity can be eliminated by removing non-essential features from frameworks and generalizing and simplifying what remains. Functional programming techniques like pure functions that don't cause side effects can help reduce complexity by making code simpler to test and reuse.