Programming: from craft to scientific discipline