This article was originally published in Stackoverflow by our founder Rahul Varshneya.
The IT outsourcing industry garnered $62 billion in revenue in 2018 and has become a truly global business; you’re just as likely to outsource work to Ukraine or Canada as you are to India or Brazil. It’s not just helpful for startups and non-tech firms. Major companies like Slack, GitHub, Alibaba, and WhatsApp, have successfully leveraged the benefits of outsourcing development in their initial days to reach their current heights of success.
Outsourcing has the potential to improve your business’ efficiency, reduce the time to market of your application, and result in significant cost-savings, but only if it is done correctly. There are significant risks involved in outsourcing development as well. These can negatively affect your business’ bottom line and cause projects to come crashing down before you get a chance to launch.
Crafting an effective outsourcing strategy
While outsourcing development has its set of benefits, it can quickly turn out to be detrimental to the business goals if it isn’t set up and managed in an organized manner. Let’s be real, finding a trustworthy development company to partner with you in your development efforts can be a tricky task. The task becomes even more intricate if the company outsourcing development is not a tech company.
Having worked extensively with outsourcing firms in the past and subsequently co-founding a custom software development company, here’s my guide to the dos and don’ts of outsourcing software development.
Common pitfalls in outsourcing development and how to avoid them
1. Communication barriers
The biggest benefit of outsourcing development, gaining access to a global pool of talent, also creates one of the major pitfalls — issues in communication. You’ll need to overcome different time zones, languages, and cultural conventions. Establishing regular channels of communication with the outsourced team becomes of crucial importance for ensuring project success.
Vivek Kumar, the founder and CEO of Qlicket, experienced first hand the downsides of poor communication channels when he outsourced the development of his employee feedback kiosk. He mentioned in a recent survey that the developers stopped responding one day out of the blue and failed to deliver the assignment. “Whether it comes in the form of relocating a founder, holding frequent check-in calls, or some other method, transparency and frequent communications are necessities for small business outsourcing”, he told Clutch.co. He now firmly believes in the importance of frequently communicating and engaging with remote contractors.
Effective communication is a skill, while English is merely a language. When communicating with outsourced developers, comprehension of the project requirements and clarity on the deliverables are the most important factors.
Use of collaboration tools, like Jira and Asana, regular engagement with the remote team via video or audio communication, and stand-up meetings at regular intervals, are best practices for establishing communication channels with the outsourced development team.
2. Failure in understanding the scope of the project
Before outsourcing development to a remote team, clarity on the requirements and deliverables that you expect, expected timeline to deliver, and overall scope of the project, is essential for successful outsourcing.
Failure to communicate these details may result in scope creep and misalignment on the product vision. Without resolving these issues, the software engineers will continue working in silos and there will be a widening gap between your expectations and the actual deliverables.
The groundwork has to be established by you and the features that you want to be incorporated in the app need to be clearly documented. A software requirements specification(SRS) document can be an excellent starting point that gives the development team clear insights into the requirements.
For non-tech companies, drafting this kind of document can seem daunting. I recommend using an SRS template which can help with the documentation process.
The SRS document helps you organize the essential project requirements you want the outsourced development team to be aware of when they start. The dev team then does their own work adding further detailing on it. This collaboration allows both sides to build a common plan, a shared blueprint that is established before any actual production work begins.
For example, if the application to be developed needs a signup page, the initial SRS document will only list out the signup options that need to be incorporated. Through collaboration with your software vendor, it would be wise to then add additional detail: for example to specify the functional specifications for each element on the signup page, the validation checks that need to be in place, and a list of possible scenarios that need to be covered.
Clarity in documentation is the first step in ensuring that your expectations and the deliverables that the outsourced company provides are in sync with each other.
3. Code quality challenges
Determining whether the outsourced development team is adhering to the quality standards while coding your application is a challenge that becomes amplified when you work for or run a non-tech firm without significant coding expertise. Code quality is an ambiguous term because there are arguably no strict definitions for high quality and low-quality code.
Code quality is a collection of attributes that need to be communicated with the outsourced development team. In my experience, good code needs to have two key qualities: clarity and maintainability.
Well-documented and well-tested code that follows the formatting best practices and coding conventions of the programming language the application is being written in is crucial for long-term success and bug-free execution (or as close to bug-free as anyone can reasonably expect. You can’t squash em’ all.)
Maintaining code quality when outsourcing development to offshore teams requires communication of expectations, laying down the quality benchmarks in advance, and regular briefings with the team to stay on top of the development efforts.
The team that you are outsourcing to should have checks in place to ensure consistency in code quality. Before you sign on a firm, ask if they take measures like code review (both peer-to-peer and with management), unit testing, as well as functional testing. These precautions will help ensure they have developed a robust application before releasing it to you.
An established quality assurance process with thorough application testing — including regression testing whenever any changes are made to the code and use of project management tools for logging of issues and management of backlogs — are some of the basics I recommend you look for when choosing where to outsource your work.
4. Ambiguity of stakeholders
Lack of project ownership is one of the biggest downsides of outsourcing. If the outsourcing partner that you pick employs programmers on a contractual basis and not full time, the actual project ownership becomes dicey. Back-and-forth of resources on your project can result in inconsistency on the deliverables, because there is no project leader or consistent team who is accountable for the work and present throughout the entire process.
When outsourcing development of a software project, make sure you understand who will be working on it and try to ensure that at least a few of the project managers stay consistent throughout the entire process. These are the folks who you can hold accountable, and who should be present on email threads, video calls, and other regular check-ins.
I find it’s very helpful to have a business analyst or project manager as a key stakeholder on the team. This person can act as a facilitator between you and the developers, documenting the functional specifications and breaking down the requirements to the developers.
A developer who doesn’t just write the code but is also invested in providing a stellar user experience to your customers is another asset you should look for when selecting an outsourcing partner. Finding a company who can become potential stakeholders in your project and who are committed to finding the right solutions rather than implementing quick fixes is key to successful outsourcing.
5. Loopholes when signing the contract
In the early days of a startup, handing out huge amounts of money for legal fees doesn’t seem like a viable option. But a loosely framed contract, or one that leans in favor of the contractor, may result in loopholes which can be exploited by the outsourcing company and result in severe monetary losses.
Yoav Achiam, the co-founder of GuardianEYE, knows the price of a poorly written outsourcing contract. In an article on tips for signing an outsourcing contract, he talks about all that went wrong when he signed a contract with the outsourcing company himself. “The contract did not include a time commitment, layout of the assigned manpower, penalties if deadlines were not met, nor positive reinforcement if development went faster than expected,” he wrote. It’s no surprise that things soon went downhill from there.
The age-old saying “Get it in writing” is vital in software development as well. A properly drafted contract acts as a roadmap for the outsourced contractors to follow and safeguards you from bearing the brunt of losses in case things take a wrong turn.
Best practices when signing an outsourcing contract
Drafting a tight contract that is free from any legal loopholes helps ensure that you do not miss out on any of the vital issues during application development. Here are the things that you should be keeping in mind when drafting a contract with the outsourcing agency.
- Outline the deliverables as well as the timeframes: The contract needs to clearly state the deliverables expected in the form of feature lists or user stories and the estimated timeline that the contractor would be able to complete work. An outsourcing agency that follows Agile development methodology and breaks down the requirements into sprints can help give an accurate picture of the development progress.
- Feature-based contacts over time-based ones: Instead of contracts that outline time-based development and deployment, having a feature-based contract that prioritizes a well-written and thoroughly tested application over one in which the developers are motivated to simply adhere to the timelines. Dividing the deliverables into task level sprints helps to ensure ownership and accountability in the company you are outsourcing to.
- Milestone based payments: Breaking down the project into distinct milestones and defining the payment schedule in accordance with the achievement of these milestones simplifies the payment structure. Plan regular follow-ups for achieving milestones and schedule stand up meetings with the team. Having a milestone-based payment schedule brings a lot of clarity to the contract and eases the resolution of any conflicts in payment.
- Instilling code guarantees: Application acceptance without code guarantee is a big no-no. The contract that you sign that should specify that the code you receive is free of any malware and specify the acceptance testing period. A period of 5-10 days is a reasonable timeframe within which any bugs found within the application need to be fixed at the contractor’s expense. The contract should also specify how the web hosting or app store submissions would be managed
- Maintenance support contracts: Any outsourcing company worth their salt would not leave you hanging in the air without any support contracts. A maintenance support contract should clearly state the duration for which the team will provide support on software they built and delivered. Specifying support in the project also results in an enhanced sense of ownership for the developers working on building your application. They know sloppy code will mean more work for them down the road.
- Intellectual property rights: As a client, you have the complete rights to your project but make sure you have this in writing by including the intellectual property rights clause in the contract. This will save you from some big headaches if any rights infringement issues pop up in the future. It would also prevent the contractor from reusing the code written for your application when working for a possible competitor in the future.
- Confidentiality agreement: A confidentiality agreement is a non-disclosure clause that ensures the secrecy of the proprietary information that you share with the contractors. It ensures that your app idea cannot be copied or shared with others. Non-disclosure and confidentiality agreements should be signed not just with the outsourcing agency but with individual developers. That offers some protection against coders who leave the outsourcing firm and work on your business idea themselves.
- Indemnity clauses: Indemnity clauses are the legal provisions included within the contract that addresses the risk responsibility distribution between you and the outsourcing agency. It states who would bear the legal fees and pay for any lawsuits that crop up in the application being developed.
- Termination clause: While you hope that things should go smoothly, it is always advisable to be prepared for worst-case scenarios. Make sure you include a termination clause in your contract that clearly states the course of action that will be taken when things go south and project fails to reach completion.
- Jurisdiction for resolution of issues: Outsourcing has made software development a truly global process. Deciding the jurisdiction in which any dispute that arises would get resolved and mentioning it in the contract is necessary to determine the laws under which the contract is covered.