Software development - a rigorous approach