The Double-Edged Sword of Abstraction in Software Engineering