It's shades of gray honestly. Sometimes they are very good (especially if you need some small tool that scratches a particular itch or want something that is 50% there right now), other times they're extremely dumb and write horrible code. Especially of you want them to use some modern feature of your language that they don't know anything about, or when the language in question isn't very popular, or when the library you are using at the same time isn't very popular, changed a lot recently and is big. They can go in circles for hours with 'wait actually ..., actually ..., but wait ..., but actually ..., ad nauseam. But when you limit them in scope, give realistic goals and constraints they more often than not work good.