Is hiring offshore web developers worth it?
Hiring offshore web development has always been controversial. While we're a web design and development company based in Atlanta, we could still stand to benefit from hiring an offshore development team if we get overbooked. But is that really a smart decision?
Why offshore web development
Before going any further, I think it's important to understand what "offshore development" really entails since it seems to have taken on quite a few meanings.
Defining offshore development
A great programmer will still produce good quality code no matter what country they're in. Developers from countries like the U.S., Canada, and the U.K. generally come with higher hourly price tags, whereas those from India, China, and Russia come at a fraction of the price.
For the purposes of this article, an offshore web developer will refer not necessarily to someone overseas, but a developer in a country that allow for lower hourly costs.
Advantages of offshore development
The advantages aren't a secret. Development is cheaper- period.
There are other arguments in favor of offshore, such as the ability to scale up the number of developers needed if the project becomes busy, but this is not specific to offshore development companies. The exact same argument could be made to local web design companies in Atlanta or elsewhere. However, scaling can be significantly cheaper, but again this is an argument in favor of cheaper costs.
That doesn't downplay the role of cost in application development- it's a huge factor in any web development and should be considered heavily.
Problems with hiring offshore
Communicating ideas between developers and clients, whether they be design related or about how code should work, can be difficult even in English. There are technical terms that a client cannot be expected to know and confusion will ensue.
I want to change the buttons at the top of my page to highlight in blue.
– Anonymous Client
This is a real quote from a client and we did what he asked, but he couldn't figure out why he wasn't seeing these changes until we shared screenshots to clear things up.
What was the confusion? He wanted to change the navigation to a blue background color. A button to me is a UI element that generally has some time of background and borders to enclose it. A navigation link is the item that generally sits on the top of your site. "Highlight" I interpreted as a hover color, when it was meant to be a background color.
These are the accepted terms for the industry and I don't expect everyone to know them, but it does lead to confusion, especially when communicating with those who aren't professionals developers or designers.
Now multiply this confusion by about 2-3x and you'll have the level of confusion with the same issues in a foreign language.
I don't believe the distance or ability to meet in person affects project performance. Even with our local clients in Atlanta we still do most of our work remotely and things run very smoothly. I've actually written about why I think it's advantageous to work remotely as most in-person meetings are less than productive and just waste both parties time.
The largest disadvantage is the time zone factor (finding good times for meeting points when both clients and developers are working), but with a flexible development team, this should not be a huge challenge.
Does it matter? YES, yes it does. Let me give you a quick example of the type of work I've seen. (Don't worry, I'll explain them in layman terms.)
$post_id = $_GET['post_id']; $sql = "SELECT * FROM 'posts' WHERE id = " + $post_id;
This is just a simple way in PHP to get the post from your database based on the id given in the url. But this code isn't escaped or filtered at all and could easily lead to SQL injection and a hacked site. For example, I could easily pass this as a parameter without any other login credentials and delete all the posts from your database:
1; DROP TABLE posts
I've seen this way too many times and it's just plain lazy coding. Granted I've seen this from a local web developer in Atlanta as well, I've seen it more in offshore work.
Extending a web application
This is a bit of a continuation on code quality, but it's something very important when it comes to developing web apps and my biggest gripe with offshore development.
Code needs to be kept DRY (Don't Repeat Yourself) and maintainable. Take a look at this piece of code in Ruby on Rails on a project we inherited after it was worked on by an offshore development company:
if current_user.role == 'admin' redirect_to admin_panel_url end
The action here is simple (and Ruby makes things very legible :))- if the logged in user is an admin, send them to the admin panel.
Now there's nothing inherently wrong with this code, but the client had multiple user roles and later decided that 'editors' should be able to access the admin panel as well. The problem? That same line of code checking the role of admin was in nearly 40 different locations around the app.
Part of being a great developer is having the foresight to prevent these kinds of problems. A few lines of code in the user model could have prevented this mess:
def can_access_admin_panel? case self.role when 'admin', 'editor' then return true end return false end
Or better yet, use a Ruby gem like CanCanCan to define ability's by action:
if can? :show AdminPanel
Cost of mistakes
Rolling this all back around to the big advantage of cost savings- did those lower upfront costs save you money in the end? If you managed to get high quality code out of it, then certainly. If you were unlucky, maybe not so much.
In our example above with the user access, I'm sure some costs were saved from the initial setup, but the client would go on to also request that a yet another new role be added and that different user roles would grant different access to various parts of the admin panel.
With the original (not DRY) method, that would have totaled over 100 different lines of code around the application be changed, while the new method required up to 5 lines of code changed in a single file. So discounting the fact that lines of code written is a terrible metric for performance and that hunting down those various lines is not going to translate into linear time charged for each method on a line-by-line basis, did the client save money with the offshore route?
Nope. For those slightly mathematically challenged, 100 lines to 5 is a 20 fold increase. That means if you were paying a U.S. developer $100 per hour, you would have to pay the offshore counterpart $5 per hour for the total cost to be worth all those glorious savings, otherwise you spent more in the end.
Results from our offshore hire experience
At Echo 5, we've experimented with offshore development for our own company projects. Personally, I was ecstatic to pay about a quarter of the price for development and ease some of my workload. Two instances stand out in my mind from this endeavor.
The fast and cheap programmer
This guy was pretty good and his rates were phenomenal. He completed a piece of a plugin that I would have personally charged much higher for. Once completed, I reviewed his code and as I expected, it somewhat resembled a house held together with twigs and duct tape. It would not work for the final product and any slight modifications caused errors.
But at that price, how I could complain? Still happy with what we'd paid for, I started fixing up the code. And in the end, I revised 83% of the code that he had given us (yes, we actually checked).
Sure, we paid about 20% of what it would cost us, but we only received 17% of what we expected and with a subpar product.
The slow delivery programmer
On the opposite side of the spectrum we found a developer who actually gave us really great quality code. Paying a bit more at $35 an hour (still very cheap for development though), we were pretty happy with the code he provided and did not need to make any changes.
Unfortunately, it took him about 4 hours to provide the same code that took us only 1 hour, putting his effective hourly rate at $140. Holy smokes- we're paying this guy more than what we'd make for the same code AND teaching him how to do it.
Is offshore development cost effective?
Like I said in the beginning, this is not an attempt to bash offshore developers, but if it's not obvious, the good ones come at about the same cost. The real goal should be to find high quality developers.
Can offshore development be cost effective? I'm sure it can, but not by the margins people expect. Don't expect to pay 25% of what something should cost and get the same item. More importantly, finding a skilled developer is tough.
Finding the right web developer
Had we not been developers ourselves, we probably would not have caught the mistakes made by the offshore developers until it was too late. I couldn't possible expect a non-developer to be able to differentiate between good and bad code, even if they're given full access to the repository.
Like most projects, there needs to be a source of trust and accountability that most web development companies provide out of the box. Too often various developers with different specialties are hired onto a project to work on their individual piece, but doing so fails to look at the big picture.
Hiring a specialized developer is great, but without a project manager who understands the whole application, the project is going to a patchwork of different coding styles.
Will we outsource work ever again?
Right now I don't see this work as being "client-ready." The type of work we've received is not something I'd risk using in a client's project.
That said, if we found the right team at a fair price with the ability to communicate well and follow instructions, we would consider outsourcing again. This doesn't replace the need on our end to have a project manager in place to run interference with those developers, but it is still a possibility.
Either way, the most important piece to this puzzle is finding a trustworthy web developer to establish a long term relationship with.
Have experiences with offshore development? Let us know how it ended up in the comments below!