I find this paper [1] very interesting and elaborates on this issue -- "From experience it appears that there are three major semantic hurdles which trip up novice
imperative programmers. In order they are: assignment and sequence, recursion/iteration and concurrency".
[1] http://www.eis.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf