On designing algorithms