This.
I'd add "5. Prepared to stick at something for at least 3 years".
I've worked with numerous people doing coding who haven't had a computer science degree... on the whole they've all been extremely competent at web and web-service type stuff which didn't demand complex designs or have problems of great technical difficulty to overcome.
When its come to doing less conventional dev work, they've started to flounder. Their architectures tend to be mediocre, they've often got no familiarity with moderately esoteric things like function pointers or closures and they take a long time to 'get' patterns and idioms. Anything that isn't a straightfoward coding exercise tends to be a struggle, because it is something they've not really had to worry about before.
If they're caught early enough and given a job in a decent team writing non-trivial applications, everything is great. But due to the difficulty of landing that first job without a degree, they grow up, their brains become less plastic and they end up with a load of ingrained atrocious habits.
That's not to say an appropriate degree washes all these sins away, but it makes a good foundation for a competent software engineer and puts them in a better position to answer the tough interview questions too.