designing software requires knowledge