I’ve been freelancing for over ten years, sometimes moonlighting when I have a full-time job, sometimes doing just freelance work. I’ve learned a few things about successful freelance progrramming.
Do what you know how to do
Clients pay you to solve their problems. They aren’t interested in how cool Haskell is, and they don’t want to pay you to learn new tools and languages. I can’t count how many projects that I’ve taken on after the original programmer quit or was let go because he got in over his head. Expand your skills to stay competitive and don’t fall in love with languages du jour for their own sake.
Stay with the herd
If you have an exotic in-demand skill by all means use it. But if you decide to learn Lisp because you see Lisp freelancers making top dollar, think hard about how you will compete with them. Sure, there are lots of PHP programmers out there, but most of them are amateurs you can easily compete with, and there’s more than enough PHP work to go around. It’s much harder to compete with skilled and experienced experts for a small number of jobs. You want to do what everyone else is making money at, but better, so you’re playing basketball against a team of sixth graders, not trying to join the NBA.
Don’t try to do everything
Be careful you don’t get buried doing technical support, hardware installation, design, art production, etc. Stick with your competencies. Find other freelancers who specialize in the things you don’t do and send them business, and they will do the same for you.
Don’t take jobs that are too big
If the project is too hard to describe on a sheet of paper, or it has a schedule spanning months or years, be careful. Big projects are usually too much for one person. If you are tempted to take a big project try to break it into smaller projects with shorter-term deliverables so you and the client see progress and accomplishment.
Avoid bad clients
If the client seems angry, bossy, stingy, greedy, abusive, too demanding, too controlling, etc. step away. You will find other clients. If you can’t imagine a professional and rewarding relationship with your client, or if you feel dirty about whatever it is they are doing, say no.
You will get most business from referrals
Do a good job, leave your clients happy, work with other freelancers and develop a network of people who will recommend you and send work your way.
Don’t bother trying to look like a “real” business
Plenty of entrepreneurs get caught up accumulating the trappings of a big company. You don’t need a fancy web site, letterhead, office, etc. You probably don’t even need to form a corporation or LLC. Unless you have employees or manage to bill for 72 hours every day you won’t make enough money to justify anything elaborate or supposedly “professional.” Your clients won’t care that you work from home and don’t have all the trappings.
Use source control and issue tracking
Learn how to use source control and web-based issue (bug) tracking. Keep a wiki for each project documenting the requirements, questions, and decisions. Use the tools yourself and get your clients to report bugs through the system. I use ProjectLocker, there are other cheap hosted solutions out there. Don’t waste your time setting this up on your own servers.
Keep track of your time and bill regularly
The best way to get paid is to keep track of your time accurately and bill your clients regularly. I prefer to work hourly and send invoices every two weeks. You don’t need a full-blown accounting system, there are hosted time tracking and invoicing solutions like BlinkSale that do most of the work for you.
Don’t subcontract
I recommend working with other freelancers, but I don’t like subcontracting work out. Chances are you will spend almost as much time explaining the project and reviewing the work as you would spend doing it yourself. Any programmer as good as you will cost as much anyway; if you think you are getting a bargain with a $12/hour programmer you found on Craigslist, good luck with that. If you take on more work than you can handle try referring it to another freelancer who will return the favor.
Use agile development techniques
Clients like to see progress. Misunderstanding requirements is the most costly mistake you will make. Agile development, with short-term deliverables and frequent reviews will keep your client happy and keep you from going off in the weeds. You don’t need to sell your clients on agile, they don’t care anyway. Just tell them how you do things and what you need from them.
Keep your clients informed
Post all work online so your client can see what you’re doing. Programming is mysterious enough to most people, so keep your work visible so clients feel comfortable with you. I’ve found that an agile, transparent process heads off billing disputes, and once clients get used to your high customer service standards they are less likely to give work to other freelancers.