How can self-learners learn programming in the most efficient way? A pragmatic approach