Yet the biggest hurdle for me was actually trying to grasp OOP. I understood what function is, a loop, an condition a variable, a record, but I had very hard time to understand why I needed to write classes, instantiate them, make property private... Now I get it: polymorphism, encapsulation. But still. These are not easy concepts for people with no formal compsci education.
SVN, I got it, MYSQL I got it, but OO? fast forward 10 years and I was all about Symfony 2, design patterns, IoC, ...
My point being that anybody can learn to code and write programs. I just feel like higher abstraction like OO, while they are certainly elegant and useful for maintaining huge codebases, are not necessarily something people wanting to learn programming should be obsessed about (though obviously, all most successful modern languages tend to be OO now, so they have no choice). I don't think PHP would have been that much of success if it forced OOP everywhere when it started.
I mean people programmed without OO for decades before it became really mainstream, therefore most programmers did not have to understand the concepts it carried to work.