Program design methods