I've worked with a handful of Indian developers who were great, and happened to be living in the US. Almost all Indian developers I've dealt (or had colleagues deal witH) with remotely (them living in India) were not good. Surely there's not something inherently genetic, as the people I worked with here in the US would be just as bad.
The common trait I noticed with the 'bad' developers in India was a tendency to always say 'yes', almost in a servile manner.
"These are the goals for the next week - can we hit those?" "Yes".
"We need to incorporate some full text search, either with Solr or direct Lucene - do you have experience with either?" "Yes".
"I need the login system to also do some logging and alerts based on the criteria I sent over yesterday. Was there anything in the email you have questions on?" "No".
OK, in that last one, the answer was a 'no', but the 'yes' position - "Yes, I can do it, I know this, everything will be fine" got to be a bit baffling, because clearly after several days or weeks would go by and nothing would get done... asking "did you understand the specs from 2 weeks ago?" was met with a knee-jerk "yes", yet the understanding wasn't there.
No doubt, I've encountered this with non Indian developers of all stripes and locations, but far less often. It feels like culturally there is a big emphasis on projecting an image that you know everything that needs to be known. I think that's common to many cultures/locations, and perhaps more common in software than other fields (?). But it's also easier to detect when you're face to face, even just on an infrequent basis.
All that said, I did a code review of code from the Ukraine recently - it made me weep with joy (almost literally). It was a massive project, but it was some of the cleanest code I've seen in more than 15 years, and probably the cleanest code I've ever seen of that size that was not a large open source project. I was humbled at how good it was, and how disciplined that entire team was. One thing I learned about their operation is that they have regular communication daily, and one of the project managers gets over to Ukraine every so often for some face to face time. I can't say that's the key, but I bet it doesn't hurt.
EDIT: Someone else mentioned specs being vague. This brings up another point I've noticed with offshore Indian developers moreso than others - a willingness to ask for clarifications. It ties in with my point above, I think, but is another angle. The Indian developers I worked with in the US seemed quite comfortable asking questions about specs/docs - the ones I've worked with who were based in India rarely asked questions about anything. Is this just cultural (living in the US tends to make you question things more?) or something else, or just my lone experiences and everyone else's is the opposite?
The common trait I noticed with the 'bad' developers in India was a tendency to always say 'yes', almost in a servile manner.
This may likely have nothing to do with <programming>, per-se. Others can chime in with more nuance, but essentially you are seeing a culture gap. Imagine a culture where it is incredibly rude to say 'no' directly; and its equally bad to put someone in a predicament where they must say 'no' directly either as well. In this situation, a simple confirmation sequence that might be common in the USA ("everybody OK? This will be done tomorrow, yes?") which is also sort of leading and yet reflexive can be counter-productive. To put this another way, in the USA its common to ask "how are you?" but its very uncommon to answer "bad". The common answer is 'fine, thanks'. That is the type of 'yes' you are getting...its a formality (not an analysis). The format of communication (like a 'how are you?') may not be viewed as an appropriate context for <debate> (especially, breaking rank in front of peers, etc.)/
Anyway, its interesting premise to consider if its applicable in your situation(s). It makes remote team work much more challenging somtimes, that is for sure in my experience.
I completely believe it is mostly cultural, but still don't quite understand it (did a tiny bit of work in China years ago - another big cultural shift).
The 'formalities' of "how ya' coin'?" "fine, thanks" generally don't have any bearing on my professional work schedule. Someone who says "fine" when they're unhappy... that can lead to problems, but they have other outlets to deal with that. Someone who is essentially lying on a consistent basis on a team project - that has a much bigger impact.
"Do you have any questions about the project?" "No"
"If you have any questions, reach out ASAP - call/email 24/7 if you need anything." "OK".
2 weeks later... nothing's done, and it's clear the other party had 0 clue about what was asked for.
Again... the impact of this on projects is way different from casual/social/watercooler chat. I just don't understand the culture differences enough to know what it stems from and how to combat it.
That said, I'm not in a position where I'm dealing with any Indian-based developers right now, although that might change in January.
I've talked with some programmers about this who moved from India to the USA and do excellently there.
In their view the problem is the family culture. Since India is in large parts still very much a developing country and has been for a very long time, they have big families with the expectation that big multi-generational families care for one another as a group. That includes getting jobs, food, etc.
So these people grow up being able to ask most of their social circle to help them in some manner and being able to expect to get this help unquestioned. So quite a few indians use family connections to get into IT jobs they have zero qualification for, by being helped by family, acquaintainces, etc. That is why in chat you often see indian developers ask very bluntly for someone to do their job for them.
I'm not entirely sure where this "yes" culture comes from, but i suspect it is connected with this knowledge that they don't know anything pairing with the desire to keep the job, because it's not just their income, but their entire family's.
I share your observations, but take umbrage with this:
>It feels like culturally there is a big emphasis on projecting an image that you know everything that needs to be known
I don't think it's about projecting an image. My way of thinking about it is that inside everyone's head there is a module that's responsible for taking two inputs (1: the state that you would like to exist, 2: the state that you observe to exist), and producing one output: the state you believe to exist. Different people have different algorithms for doing it. Certain algorithms are more prevalent in some cultures than others. I know several Americans who heavily weight input #1.
I lived in Bangalore for a few months, and have taken long vacations in India twice. I found that the issue described is very similar whether you're booking a taxi in advance (not a great idea, btw), or outsourcing code. My rationalization helps me to be at peace with it most of the time, but not all.
This is inherent to any country where software outsourcing is a significant industry.
The outsourcers sell billable hours that are supposed to be cheaper than hours of developers hired locally, but during industry boom any individual contributor worth their while will shop around for Microsoft/Amazon/Google/Facebook/Yahoo offers that come attached with H1Bs and salaries much higher than local, even accounting for cost of living.
The common trait I noticed with the 'bad' developers in India was a tendency to always say 'yes', almost in a servile manner.
"These are the goals for the next week - can we hit those?" "Yes".
"We need to incorporate some full text search, either with Solr or direct Lucene - do you have experience with either?" "Yes".
"I need the login system to also do some logging and alerts based on the criteria I sent over yesterday. Was there anything in the email you have questions on?" "No".
OK, in that last one, the answer was a 'no', but the 'yes' position - "Yes, I can do it, I know this, everything will be fine" got to be a bit baffling, because clearly after several days or weeks would go by and nothing would get done... asking "did you understand the specs from 2 weeks ago?" was met with a knee-jerk "yes", yet the understanding wasn't there.
No doubt, I've encountered this with non Indian developers of all stripes and locations, but far less often. It feels like culturally there is a big emphasis on projecting an image that you know everything that needs to be known. I think that's common to many cultures/locations, and perhaps more common in software than other fields (?). But it's also easier to detect when you're face to face, even just on an infrequent basis.
All that said, I did a code review of code from the Ukraine recently - it made me weep with joy (almost literally). It was a massive project, but it was some of the cleanest code I've seen in more than 15 years, and probably the cleanest code I've ever seen of that size that was not a large open source project. I was humbled at how good it was, and how disciplined that entire team was. One thing I learned about their operation is that they have regular communication daily, and one of the project managers gets over to Ukraine every so often for some face to face time. I can't say that's the key, but I bet it doesn't hurt.
EDIT: Someone else mentioned specs being vague. This brings up another point I've noticed with offshore Indian developers moreso than others - a willingness to ask for clarifications. It ties in with my point above, I think, but is another angle. The Indian developers I worked with in the US seemed quite comfortable asking questions about specs/docs - the ones I've worked with who were based in India rarely asked questions about anything. Is this just cultural (living in the US tends to make you question things more?) or something else, or just my lone experiences and everyone else's is the opposite?