Selecting the right candidates is tricky and many factors come into play.
Academia doesn’t prepare candidates for real world software development so you can’t rely on a degree as an indicator of ability.
I usually ask general knowledge questions in interviews as it gives me a sense of whether the person applying to work with me is actually interested in the industry and what is going on in it or just looking for a job.
Sample work, example code, a functional prototype and mockups of ideas will all show that the person applying for a position is actually interested in the industry and making a personal effort to get to know it and become good at a specific part of the industry.
You need to work on your tolerance and acceptance.
Sometimes you’ll be faced with behaviour from people that is not at the level you expect but happens to be at the level you can currently afford. Most advice would tell you to hire slow and fire fast but when you’re constrained financially it’s difficult to just dismiss an employee you’ve invested time in grooming.
Before you go down the path of dismissal you need to think about what caused you to hire this individual and how they stood out from the other people you interviewed. It might be that the work you’ve been giving them isn’t really something they’re good at and you should consider adjusting their workload. It could also be that you haven’t given sufficient guidance or structure or explained your expectations clearly. Make sure you’re doing your part before you start coming down on your team.