Frameworks are good (when they are good). However, I'd argued that at some level of complexity programmers should recognize the need of "meta framework". That is a framework, that not just have some gaps to fill, but framework, that is a supersystem (like for example a single bus is a system and public transport system is a supersystem). That is, framework can be good for allowing programmers this:
x1 = "a"
x2= "b"
...
x100 = "aax"
but never really step to the level of:
x = ["a", "b", ..., "aax"]
This is danger no. 1
Danger number two is not recognizing computational abstractions (as the author points out). A bit extreme example is "counting on fingers": to calculate 2 + 3 one should put 2 divs and then another 3 divs to some container and then calculate it's length of 5.
In short, as original author points out, the danger is to miss abstractions.
My stance on that is that good programmers should be able not only to use frameworks for the adequate level, but also create their own when the need arise.