I'm working as a software development consultant (contractor) for a small/ish enterprise.
We have this software engineer I'll call John.
The team consists of me, the CTO and John.
John is a Senior developer with about 5-6 years of experience. He hasn't been on many projects. Used to be the CTO of his own company but he quit for reasons I'm not aware of. (it seems to me he was actually fired because he's removed from the founders list pretty much everywhere I look, may be due to him being very arrogant)
John is definitely smart and capable, but is obviously arrogant and has very strong opinions about stuff. So strong, in fact, that the "discussions" we hold most of the time aren't actually discussions, but just him rehearsing his decisions/opinions without acknowledging anything other people say.
He will interrupt you after 5 seconds of talking. Any attempt to objectively and calmly state his decision might be worse than what we have is met with a "I don't believe that". If you ask "why" you're accused of being "too attached to be willing to change the existing code". Actual reasons are never given unless in his favor. Questions are not answered if the answers can be against his position.
Problem is John insists on having these discussions all the time, as to simulate he wants external input, but the reality is he won't stop in any way until we agree with his views. It does not matter at all whether his solution is better (rarely, but it does happen), equivalent or worse. He is very good at "masking" this enough to constantly be on the edge.
He also doesn't take in account the development and refactoring time cost. Everything "must be done right from the start" and everything that he hasn't personally written is "garbage" and "will surely fall apart in the future".
He's been with us for like 6 months now and literally 0 of the predictions he's had of stuff being "doomed to failure" or "just about to fall apart" have come true. He actually had to implement some stuff and we let him do it in his fancy manner. Turned out the feature was mostly broken, but he blamed other people for that.
He was given the opportunity to write another module and instantly made it into an entirely new project using his own library/framework, that is still heavily underdeveloped (meaning that now he uses it on the project, he gets to develop it on company time).
How do I peacefully co-exist with this person and actually have productive discussions about things that affect the future of the project?
What I'm currently doing is nearly blindly agreeing to what he proposes because it's just not worth the "fight". I'm just a consultant anyways.
I sometimes need to agree with stuff that is creating us more work/making stuff more complicated than it could've been. Also, often times new problems are simply being invented as a result of these "discussions" which is also a problem.
Now I know these "conflicts" can be resolved by the CTO, because he's the one ultimately making decisions, but while he's a great person and a very decent developer, it seems he is extremely afraid of conflict and will very, very rarely share his actual opinion, leaving this fire to burn.
About those voting to close, please note the reasons in the comment section so we can improve the question.
This question is not the same as How to deal with an arrogant superior?. John is an employee and not superior to me. The situation seems quite different as well.