At Toptal, we’re always looking for the best freelancers around. But what makes a freelancer truly great? Luis Martinho, one of our top developers, is beloved by his clients — so we sat down with him to talk about freelancing, technologies like freelance Node.js and HTML5, and paying your taxes.
So, to start, how did you get into freelancing? Have you ever worked a full-time job?
“I had worked a couple of full-time jobs: some of them were relatively corporate, but the most recent was in a startup environment, specifically in the enterprise SaaS space, building sexy management software in the cloud. We had a very talented team and a very ambitious vision. After four years of growth, we had an exciting product in an exciting space, which was great, but I wasn’t very happy. I needed a lifestyle change. When we started, I personally did not understand how hard it was to “start up”. It’s not just the hours, because you work long hours in all sorts of environments and projects; it’s the stress, the responsibility, and the pains associated with creating something new. It’s not all flowers and rainbows. In the end, I decided that I wasn’t co-founder material (at least, not at the time). But the experience gave me a much deeper understanding of the kind of pressure faced by startup founders, and I know that I’ve become a better freelance software developer because of that.
Freelancing looked more and more like the life I wanted: it presented an opportunity to find interesting clients and projects while being rewarded for quality work.
I started looking for regular jobs: first in my hometown, then in the rest of the country, then in the rest of Europe. I managed to find some interesting projects, some interesting compensation packages, and some interesting locations; but I believed that I could have it all. So I began to look into freelancing. And as I kept looking, freelancing looked more and more like the life I wanted: it presented an opportunity to find interesting clients and projects while being rewarded for quality work.”
What was the toughest challenge that came about during your transition to freelance development work?
“Originally, I imagined a huge change would be the income stability that you expect from a full-time job, where you have a certain amount of money that you always get by the end of the month—and you get it, whatever happens. I expected that to be a major concern since I knew that being a freelancer meant that I wouldn’t always have clients. But that’s not really what’s happened—kind of surprisingly, at Toptal I’ve managed to always have a steady flow of clients without having to hunt for them. So, to be honest, the main challenge has really been to organize my schedule. I really don’t have any set hours to work. I basically make up my own schedule, and so I have to be more disciplined than I was before. I try to work more-or-less standard hours: I wake up in the morning, start working, have lunch at the time that everyone else has lunch, work in the afternoon, and then have dinner. I try to work a normal schedule, not pulling all-nighters, burning the midnight oil every day. This discipline was a big challenge at the start.”
But most people see loose hours as a benefit of freelance software engineering. What’s your take on that?
I’ve found that it pays off to be disciplined because I end up being much more productive if I have a set of routines.
“Certainly, it is a benefit. It’s cool in the sense that if you run into any problems, if you have to assist someone in your family, or you have this great opportunity for some kind of leisure activity, you can go after it and you can enjoy that opportunity. But on the other hand, I’ve found that it pays off to be disciplined because I end up being much more productive if I have a set of routines, because those routines basically guide me: I can cut to the chase and get more done during that time. It’s good to have that freedom, but I think it has to be used responsibly.”
Your clients love you. What’s your secret?
“As a freelance software developer, it’s probably a good trait to be slightly lazy in terms of looking for the easiest, cheapest way to get something done; to be extremely annoyed by doing repetitive work, and so to continuously improve on your tool chain. For instance, you spend a lot of time in a terminal: you should seriously consider creating shortcuts, aliases, whatever saves you time and saves you typing. In the end, a lot of the tasks you do are not really rocket science; they’re just going through a couple of loops to get something done. If you optimize that stuff and get the repetitive work out of the way, you have more time available to do the actual rocket science.
If you get the repetitive work out of the way, you have more time available to do the actual rocket science.
You also have to have someone else handle hourly pay and billing, getting money from customers, and even getting new customers so that you can focus on doing great work. And that’s absolutely important. When you’re a freelance software developer, you’re working on delivery, but also on marketing and sales. And what you want to do—and what your clients want you to do—is to spend as much time on delivery, and as little time on marketing, sales, and even finance. You’ll always have to spend time looking for new freelance development clients when you’re working for old ones, and that’s not something the old ones want—and it’s not something you want. You just want to focus on doing your work well. So having someone else handle billing and finding new clients is something that you should be very happy about, and you’re very lucky if you find it.
Also, don’t forget: pay your freelance taxes.”
How do you keep yourself motivated on a daily basis?
They feel that you’re connected to them in a way that you’re not just sending over billable hours.
“What plays a huge part in my motivation is the quality of the clients. If possible, I try to be kind of picky. That is, I try to accept gigs that motivate me in terms of the technological challenge involved whether it be solving a hard problem or working in an interesting space. And it kind of just follows from that. I always work with a client thinking that I’m working towards a common goal: I try to see the bigger picture and see myself as part of the team. You’re never really part of the internal or onsite software development team in the full emotional way, especially when you’re out of the office, but you can still feel like part of the team in terms of the overall project and the quality of the work. And I think people on the other side (the client and the client team) feel that—they feel that you’re connected to them in a way that you’re not just sending over billable development hours, you’re really worried about whether they will succeed or if the quality of the work is good enough.”
What do you look for in a potential freelance software or web development client?
“Generally, I favor more recent technologies than older ones, and also emerging stuff—I wouldn’t necessarily say emerging because some of this stuff is current, but I’d rather work with someone making single-page applications and using Backbone.js and Node.js with Express or some MVC framework than someone who would be using Java Enterprise Edition-style.
I’m freelance, I would much rather have a client that has some asynchronous communication solution in-place. If you’re telecommuting, it’s much easier to get inside a team that’s using something as simple as a mailing list or has chat rooms in Campfire or uses GitHub as a collaboration tool (this last one works remarkably well). Altogether, if the client is not capturing the water cooler talk some way, you risk losing a lot of information and chatter that can impact your work.”
That’s an interesting point. Any other tips for telecommuting?
It’s harder to remember the guy that’s never in the building.
“You have to find a way to compensate for being out of the office. The solution I’ve found is to be proactive. For instance: analyze commit logs. When you’re telecommuting, you should set aside some time just to glance through and have an idea about what other people are working on. If you’re being aware of what’s happening in daily standups, notified through some project management solution, it’s a good practice to try to find hints about what the team is working on. Then, you’re more easily integrated. That’s obviously an additional effort on your side—you might be able to get out of doing it if they have a really good communication process in place, but it can be a good tip and it can save some problems. It’s harder to remember the freelance development guy that’s never in the building.”
What’s the most important quality of a freelancer?
“You have to be someone who can maintain a fluid balance between your personal life and your work. As a freelancer, it’s important to be responsive. But being responsive ends up having a big toll on your personal life. You don’t have to be checking your email all the time—you can just get notified, filter whether it’s important or not, and then you can just go back to enjoying time with your family or whatnot. You have to be a good context switcher. Context switching is usually expensive, but you need to make it cheap and fast, so that you can have a very high standard of service by being very responsive to emergencies but, at the same time, enjoying the company of friends and family.
You have to be a good context switcher. Context switching is usually expensive, but you need to make it cheap and fast.
For the usual freelance development arrangement, you have to know how to manage your finances conservatively. This hasn’t really happened with Toptal, surprisingly, but usually it’s very easy to go from feast to famine when it comes to software or web developer pay, even hourly. One month, you make a ton of money and suddenly you don’t have clients and you don’t have any more work. So you have to be disciplined: you need an idea of the average wage, and you need to spend that amount; all the excess needs to be some kind of cushion to help you sail through the uncertainties of doing this kind of work. This really isn’t that true for Toptal because the stream of clients has been really steady, but it’s still a good practice.”
As a freelancer, you take on a bunch of different software development projects throughout your career. So what do you do first time you’re given access to a new codebase? Lets say it’s a billion lines of code.
“I would try to be disciplined about taking a top-down approach. This means getting a feel for the overall structure of the codebase. That seems kind of obvious, but as you start trying to understand the code, you’ll be driven to what you’re working on at that specific moment and the specific task you have at hand. That will shift your focus from the top-down approach and will put you at the bottom trying to go up, assembling the pieces from the specific parts of code you’re looking at. That might be better in the short term for you to fix that specific bug or add that specific functionality, but in the medium term, you’ll wish you’d kept with the top-down approach. Then, you’ll have a much better view of the system and how the pieces interact.”
You’ve done a lot of front- and back-end work. Do you think it’s important for freelance developers today to have both of those skillsets?
“Nope. I’ll be very honest: I think you can gain a lot from specialization, like if you’re ridiculously good with a ridiculously small set of technologies; but it’s just a personal choice. I’m curious, so I work with a lot of different technologies. And that’s why I end up doing both front-end and back-end freelance work.
Technologies will change — what’s hot today will be boring probably tomorrow or at least in 6-12 months.
Having said that, I think it’s crucial for a developer, throughout his or her professional lifetime, to try and learn as many technologies and paradigms as possible. Technologies will change—what’s hot today will be boring probably tomorrow or at least in 6-12 months—and one of the key skillsets for a freelance software developer is to quickly pickup a new technology or a new project. For that, it really helps if you have a systematic approach to learning new stuff and you practice it by learning at least one new language or framework or paradigm every year.”
You’ve done a ton of freelance work with Rails, Django, and more recently, Node.js. How have your experiences differed between the three?
What are your favorite tools that too few developers are using?
If a freelance client wanted you to do a project with Rust or Go, or some new language with which you’ve never worked, what would you say?
No matter how good you are, there will always be setup time, and that can be costly for the client.
“I usually try to get my first contact with languages outside of client work, not on the client’s time—no matter how good you are, there will always be setup time, and that can be costly for the client. That being said, if the client told me, “Ok, we’re comfortable even if you don’t know anything about it”, I would see that as a great opportunity to learn something new. On the other hand, if the client had a demanding schedule, I would advise them to hire someone else or use a language that I was comfortable with so I knew I could be productive from the get go.”
What’s the biggest technical challenge that you’ve had to solve while freelancing?
“A freelance HTML5 project comes to mind. Digging into the HTML5 Canvas API to do some advanced graphics editor functionality, like doing lasso selection and freeform selection, where you crop a part of the image but leave out the rest, calculations with sets of pixels, things like that. This was kind of like MS Paint using HTML5 Canvas and implementing things like a brush: you’d think a brush would be something simple—it is if you just draw a line, but in this case you want to imitate a brush stroke, so I had to use a mathematical formula to simulate how a brush would contact the canvas and leave a blur with ink.”
Your favorite new technology that you’ve worked with lately?
“What I’ve been hearing about Meteor is interesting in terms of how they offer a complete head-and-shoulders framework for developing a single-page application. It handles the back-end as well as the front-end. I haven’t worked with it but I’m curious and itching to try it out.”