The U.S. job market is still in a slump for most recent college grads, and even law school graduates are finding it tough to get in the door with a decent firm. But when it comes to coders, it’s a different story: In the world of software engineering, there are only 8 qualified candidates for every 10 openings.

Particularly in the San Francisco Bay area, where my company, Instore, is based, top companies are constantly bidding against each other to lure over top talent. Because of the almost non-existent unemployment rate among software engineers, companies often need to poach engineers from rival companies (generally with sky-high salary packages and great office perks). Big companies like Google, Facebook, and Twitter have ample funds to hire the best talent, making it tougher for startups to compete.

Even freshly minted developers don’t come cheap: I’ve seen newbie engineers with a Codecademy “diploma”–but no actual employment history or even college degree–land jobs with starting salaries of $100,000 or more, plus benefits and stock options. Recent college grads without jobs, consider this a big hint.

Tech recruiters aren’t helping matters, either. They encourage engineers to jump from job to job, and collect commissions of $12,000 or more for each successful hire—even though many of their recruits don’t stay loyal to their employers.

So what can young companies without big balance sheets do to overcome these challenges and land skilled software engineers who’ll stick with you for the long haul?

Here’s what’s worked for us:

Plan several months ahead, rather than scrambling to make an immediate hire.
Because software developers are in high demand, applicants for a job listing who have all of the desired skills in your listing can be few and far between. Instead of hiring someone who isn’t quite right for the role, or getting into a frantic bidding war to hire the one developer you’ve found who seems to fit the bill, give your search plenty of time. We’ve found that by creating a listing 6 months before we actually need to fill an engineering role, we’ll have a better shot at finding the right person for the role at a reasonable cost. If you make your hires earlier than 6 months, as we have recently, it will feel like a victory vs. a slog.

Use technology-enabled recruiting services to find potential hires.
Rather than using recruiting agencies, which often work to serve their own interests rather than their clients’ interests, we’ve relied on online tools such as AngelList, which includes a free job-matching service for tech companies and talent; and WhiteTruffle, a premium service that automatically matches employers with job candidates who have the skills you are seeking. These services can help you avoid wasting days poring over scores of resumes for under-qualified applicants by helping you spotlight the specific programming languages your applicants need experience in

Showcase why candidates should choose your startup over a large tech company.
While your startup may not be able to offer a huge campus with catered meals and an on-site gym, there are plenty of reasons a job applicant might prefer your company over Google. As a small startup, you’ll give a developer the opportunity to take a lead role in the development of a live product—he or she will have a crucial role in the business, rather than being one of many coders at a larger company. To quote one of our newest developers at Instore, “I’m having a blast working here! I get to work on customer-facing code that impacts our merchants every day. Better yet, I’m learning new skills and actually get to interact with company leadership.”

Sweeten the stock option package.
While most tech company jobs include some amount of stock options, they are often relatively small at larger companies. According to an analysis by Wealthfront, the average equity package for a software engineer in the Bay Area at a company with more than 100 employees was 0.077 percent; for a company with less than 20 employees, the average equity share was 0.628 percent. By providing new employees with significant equity, you’ll motivate them to help turn your company into the next Facebook—and, if their hard work pays off, it could turn them into multi-millionaires after an IPO or acquisition.

Think of training as part of the hiring process.
While you might prefer to hire a veteran engineer who knows multiple programming languages, they’re few and far between on the job market. Instead, consider hiring a young engineer who knows one programming language well—he or she will be able to learn others, given the opportunity. Give your new programmer time on the job to devote to professional development, with opportunities to take part in tutorial programs through Codecademy and other education platforms. At Instore, we hired a server-side developer with limited server management experience and are training him to manage our infrastructure in addition to his coding responsibilities.

Hire software engineers who live in less competitive regions to work remotely.
The Bay Area has a lot of great coders, but so do plenty of other parts of the country—and even the world. At Instore, we lured one top engineer from Minneapolis and another from San Diego, adding great talent without starting a bidding war. Given the Bay Area’s astronomical cost of living, it’s no surprise that most coders won’t live and work here for less than $100,000. However, talented engineers from other parts the country will work for lower salaries if you allow them to work remotely. There are many tools available to help you successfully manage remote workers, including Basecamp, Skype, Google Hangouts, and Pivotal Tracker (a project management tool especially for software developers).

Matt Niehaus is the CEO of Instore, an iPad-based point of sale solution for restaurants and small business owners. Previously, he served as a partner at the venture capital firm Battery Ventures, working closely with early-stage companies to guide them to success.