Software architecture definition typical