designing software requires discipline, domain knowledge, and design experience