I have been doing long-term software development with an out-of-state client. All of their dev work is done by myself and a handful of other freelancers, only one of whom I work with on a semi-regular basis.
This other guy, who I'll refer to as John, strikes me as painfully incompetent. He and I cover different portions of the front-end and back-end, so sometimes I have to ask him to do a task which I can't handle myself. When I ask him to do something, he says 'ok' and then does it in a different (usually incompatible, and always inferior) way than what I asked. Even when he tries to do it the right way, it's usually broken the first time (he never tests anything). He doesn't respond to a lot of my emails and often forgets to tell me when he makes a change that directly affects the work I'm doing.
Imagine having this conversation with someone over a two-week period:
You: I need you to make a function that accepts input in form X and returns output in form Y. [long explanation of why this is the case]
John: Okay, I made a function that accepts input in form A and returns output in form B
You: That way doesn't make sense and isn't what we need. The function needs to take in X and output Y
John: Ok, I changed the function to take in X and output B
You: No, it needs to take in X and output Y. [summarize earlier explanation]
John: Okay, I finally read all of the original email you sent me and now I understand what you are looking for. I changed the function to take in C and output Y
You: The function needs to accept input in form X and return output in form Y. The input and output cannot be in any other format
John: Okay, I did it the way you asked
You: It doesn't work
John: Oops, I didn't test it. It should be fixed now.
You: It doesn't work
John: Oops, I configured some things incorrectly. Try it now.
You: It doesn't work
John: Okay, I'll look into it...
When brainstorming a large task, he often proposes extremely low-quality solutions that would be impossible to maintain and aren't acceptable on a professional project; sometimes he even starts implementing these solutions without getting approval first. These aren't minor, "this could probably be refactored" design issues, but massive flaws that would have far-reaching repercussions if implemented in his way.
I've only complained about him directly to the client once, when he kept failing at the same simple task over and over for two weeks and was preventing us from meeting a deadline; I only addressed that single issue and not his overall ability. Since then, he's been better, but better is far short of competent. Working with him is infuriating, but I haven't approached the client about this because I don't know how to express my feelings in a professional way. He does many other tasks for the client that I am not involved in and I have no idea how he performs at those tasks; since the client hasn't fired him yet, it is possible that he is more competent on other tasks or that the client is very forgiving.
How do you explain to a client that one of their other freelancers is not competent at his job, in a professional but compelling manner?