designing abstraction