how does abstraction help us write programs