How to get into remote programming
I’ve been asked how to get into a job like mine, working remotely in a challenging and well-paid environment. I also know people doing menial jobs slowly eating away at their soul, I think they’d be much happier doing something like this. I aim this article at both kinds.
So I hope in the next 15 minutes I’ll provide a prescriptive solution for anyone over the age of 17 to start working remotely as a programmer in roughly 6 to 40 months.
All of this is highly anecdotal… take it or leave it, I guess.
I – What is remote programming?
By titles, I’m currently a “researcher” and “author”. Before I worked as a “team lead”, yet earlier as an “ML engineer”, “data engineer” before that, and half a dozen other titles.
But when you get into the applied side of tech, job titles are irrelevant, what I really work as is “smart and somewhat eloquent person that can write code and learn new things well and quickly”. This is a rather long role description, so I’m going to call it “programmer” from now on.
Being a programmer can mean writing Angular code for frontends, it can mean reading, implementing and benchmarking ML research, it can mean setting up Iaas to run an application, it can mean writing software that runs on tiny embedded chips used in garden implements. Programming means being able to discuss, research, expand and argue ideas until they are rigorous enough that a computer can be tasked with executing them.
If your dream is to work in “X” don’t worry, as long as “X” has to do with computation, you can get into “X” by being a programmer, and programming skills are almost certainly going to be the most in-demand ones in that domain.
So what about the remote part?
Remote is very nice for what amounts to four reasons:
It gives you the flexibility to control your taxes, you can have your fiscal residency anywhere, for most people this will mean anywhere from a 50 to 100% increase in their income.
You are part of a distributed organization. This gives you a lot of freedom over your schedule and almost guarantees you will work in a meritocratic environment (rather than a “perceived busyness” driven one)
You are location independent (even vis-a-vis your fiscal residency). For people like myself, this means travelling the world, for others it might mean staying in a big city with a lot of hookup avenues, spending time with their extended family, or getting a cabin in the middle of some beautiful mountains.
Switching companies has low overhead and the job market has loads of volume.
The nice thing about remote is that it combines very well with programming. If you are a good programmer you want to be able to:
Make your own schedule, since it’s priceless for creativity and focused work
Use high-conceptual-bandwidth communication (text, slack, email) as opposed to high-emotional-bandwidth communication (meetings, zoom, huddle-room)
Be judged meritocratically, based on the quality of your work
Have many options in case you want to switch companies
These things just don’t happen when you have an in-person company. People enjoy having meetings for the social aspect, especially more charismatic and neurotic people (aka management and PMs), so you end up sitting 2, 3 or even 4 hours a day in meetings. People conflate “contribution” with ”time spent at work”. Your schedule is tightly bound to that of the office. You have a very limited supply of jobs, even in a city like San Francisco or San Jose.
These are not advantages for everyone, if they aren’t for you, you will hate working remotely.
And by no means should you tie your self-worth into being a good programmer, many-o projects have been completed by mediocre or even bad programmers that were nice, charismatic, and had vision and perseverance.
There’s more to creating things than “skills”, you are not an island, you work in a team. Which is to say, please don’t get discouraged out of tech entirely if remote work ends up not being for you. Working in an office will likely remain a viable alternative up until the machines replace us all.
ii – Learn to code
Learning how to code is surprisingly easy. It boils down to wanting to make something happen, then writing the code to make it happen.
I understand this sounds silly, but as long as you’ve got a realizable objective you’re all set. Even if the things that you aim to do are really “dumb” they are probably better than whatever people are learning in a CS degree.
The main issue here is finding a realizable objective, i.e. something that a computer can do, and something that you can implement, or at least make progress towards implementing.
There are several ways to go about this:
Find a “need” and try addressing it. If you think you’ve found a need that you can actually address as a “newbie” you’re likely wrong, since most easy pickings are taken, but who knows. If you find an idea that seems easy and that you’re excited about, do yourself a favour, don’t google whether or not it exists
Create a “need” by artificially removing something from your day to day environment, forcing yourself to write and use your own custom-made app for it.
Write something “creative” that doesn’t address a need but instead provides entertainment. The prima-facia example here is a video game.
Here are some of the things I did when I started learning:
Fumbled around trying to make some “example” Java apps based on tutorials, but with my own twist added to them.
Found PHP and tried creating a few “basic” websites (e.g. a website where you could add and read hamburger recipes).
Switched my operating system from Windows to Arch Linux (a Linux distro that you have to partially “setup from scratch”), forcing myself to learn how to use Linux well in order to do anything.
Obviously, I didn’t stop there, but by the time I hit 4 I had already found a poorly paid (400$/month) part-time internship, and once you get a job your plan changes.
A lot of times people will ask if you “know a language” as a proxy for asking if you know a domain or paradigm.
“Do you know python ?” is a proxy for asking “do you know the paradigm of coding where you use a lot of libraries and write short imperative code to get stuff done quickly”.
“Do you know C++” is a proxy for “Do you know how to write very efficient code for x86 architectures with loads of cores”?
“Can you write C” means “Do you know how to program embedded devices with stack-only code”.
This is fuzzy and confusing, but rest assured, languages in of themselves are easy to learn and your initial choices don’t matter that much in the grand scheme of things.
Once you’ve picked a few languages and have some projects in mind… what?
Pick up a book or tutorial for those languages, ideally, something short, a 1-hour youtube video might be a good start. Learn as much as you can, and once you get bored, start implementing, once you get stuck, start learning, rinse and repeat until you are tired and need a break.
Once you’re done with your first project (i.e. once you’ve come to hate it or realized it’s impossible) switch to a second one, and so on.
You can intermix this with learning how to use other “tools of the trade”, once you are 2 or 3 projects in:
Try using git and github for storing a remote mirror of your projects and doing version control, to begin with, that just means having multiple versions of your project available to switch back to if something goes wrong.
Switch to using linux, and try to do most things using a “terminal”. Wanna watch a movie? Do it using a terminal command. Open a file in a text editor? Same thing. Calculate something on your phone? Try opening up a python interpreter and doing it there for a change. Check whether or not Facebook is down? Use dig and ping the IP you found.
Start learning one or two IDEs (basically a code text editor). As of the year 2021, You’ll likely want these to be Visual Studio Code or whatever Idea IDE is available for your languages of choice.
Learning some “fundamentals” also helps.
Learn to operate a server, set it up to route traffic, host a DNS server, send and receive emails, run a wordpress website. Reading about hardware, I enjoyed “what every programmer must know about memory”, but it’s a bit outdated.
Learn a bit about algorithms and data-structure, don’t waste time with the boring stuff (vectors, lists, hash-maps); They are trivial and people talking about them for more than a few minutes are just filling time, instead look at the interesting stuff: lock-free multi-threaded structures, efficient immutable structures, cache-friendly algorithms. While at it learn a bit about multiprocessing, threads, mutexes, memory ordering, all the things that have to do with parallelism.
It wouldn’t hurt if you learnt a bit of embedded programming, enough to run code on an Arduino and use it to move a robotic arm or add some effects to an audio signal.
Another important thing would be knowing how SQL databases work and how to set up a SQL server and use a SQL client (postgres or mariadb are both excellent first choices). Consider reading a book about the Linux Kernel, and another about how compilers works, the Linux books by Robert Love and the Dragon book for compilers are classics, but again, not the most up-to-date.
You will likely not need this stuff for an entry-level job, or for any job, but it’s very useful to know. There are a few hundred relatively easy concepts that underly almost all modern digital tools. A lot of people are dumbfounded by the amount, scope and complexity of modern tools because they try to understand each of them as a unitary whole, rather than a combination of a few fundamentals.
Once you understand fundamentals you’ll no longer see 1000 different tools, you’ll see 1000 different people trying to sell you 1000 slightly different combinations of a few basic tools.
Of course, don’t get carried too far away, the tales of master foo are fun to read, but don’t take them too seriously. It’s very easy to get a “seeing through the matrix” feeling, realizing how shallow and useless modern software is, and entering a “why the heck aren’t we going back to simple, stable, useful and composable programs”… followed by veering off into communism and GPL licenses.
While I don’t condemn those people, it’s not a profitable path to walk. You should stare at the fundamentals for precisely long enough to figure out how “dumb” the last 20 years of building on top of them has been; Then come back and join the fun in building stuff that is mostly useless, fun and dumb (at least for a while).
This process is going to teach you how to code. But coding does not a programmer make, you must now learn how to help other people’s ideas transform into code, ideally as part of a team. The only real way of learning is on the job.
iii – Finding a job
So, you’ve spent over 100 hours (1-3 months) learning to code? You should keep going, but it’s also high time you try to find a job.
Looking for jobs is a thing of utmost importance. It’s something you should never stop doing, at least until your stated purpose is making money and getting experience. Looking for jobs, going to interview and negotiating offers is a way to “query” the job market about how much your skills are worth, it can be a guideline about what you should learn next, what you’re good at and what you suck at.
Your first job is anything you can take. Getting some experience is so important you can afford to work in a very shitty place, as long as it’s mildly related to programming.
You should try applying for remote and local jobs, but don’t expect to find anything remote. The idea here is to spread as broadly as possible. Make a resume and make sure it gets sent to over 100 positions every day, 7 days a week, for months (creating a good CV is outside of the scope of this article, plenty of good advice out there).
Ignore the title, as long as it’s asking for under 5 years of experience go for it. I never got hired for a role that didn’t ask for at least 2x the years of work experience I had (and I never lied about it, people don’t actually care). I hired an amazing intern (with no work experience) from an advert for a senior programming position.
Apply on local job boards, ask all your friends and family to tell you if they know about something, make an account on Upwork, and fiver, and angellist, and stack overflow, and Linkedin, and indeed and 101 other job boards with remote and local work.
8 hours a day with 2 hours commute paying minimum wage? Take it
4 hours a day internship paying some meal tickets? Take it
Job on Upwork paying your 2$/hr to write docs? Take it
The local restaurant wants a wordpress website with a booking system integration and is giving free oysters every Wednesday for 2 months in return? Take it
A second-rate local drug dealer wants you to help him set up on the dark web and he’s going to set you up with some fentanyl-laced heroin in return? Take it
Unpaid position? Don’t take it, if the market won’t give you something you’re not doing actual work, and this experience will be maladaptive.
Your first job is to get that ever-precious “experience”, it will probably be shit and you’ll probably want to be constantly looking for another job while doing it; Take the first semi-decent offer that comes knocking. It’s usually on your 3rd or 4th role (i.e. a “senior” role of sorts) that you have a serious chance at getting a remote role, some people do it from the very start, but you shouldn’t expect this.
For subsequent jobs you need to understand:
The company you work for is not your friend. If it was “expected” of you to stay at least
xmonths at a company they’d have signed a contract saying that (and giving you certain guarantees, for example, an
xmonth notice before firing you). Its goal is not to make you happy or rich, nor to pay you as much as “you’re worth”. Its goal is to bring value to shareholders, and it will sacrifice your happiness and try to make you work for cheap to accomplish that. That’s not to say the company is “malicious”, it’s expected of it to act that way, and it’s expected of your to act in a self-interested way, that’s the way the game works.
Your manager/boss/PM/coworker/etc is not entitled to your work as an act of friendship. If your coworkers are your friends, they will remain so even if you quit. If they are truly an important part of your social life, you can hang out with them outside of work. I had coworkers that I remained friends with long after I quit.
The market value of your skills is the market value of your skills. If you’ve had 10x interviews for a position doing
xand the highest bid you’ve got is
n, that’s close to the upper cap of market value for you doing
x. Listen to the market, don’t oversell yourself, don’t hold out for a mythical offer that doesn’t exist.
Initially, you want to be optimizing for salary because that’s the most certain way of knowing that you’re doing and learning something “useful”. Doing charity work or, God forbid, paying someone to work for them, ala college, is the safest way to not only waste time, but “learn” bad habits that are outright harmful in a for-profit venture.
Once you’ve reached the kind of salary that is acceptable (as a guideline, aim for the top 1% of income in the country you live in), start to think about optimizing for other things, like working on products you’re passionate about, or working with people you really like, or with a very niche language that you love, or whatever.
A lot of people seem to fail to find a job because they don’t actually do what they are supposed to, they do it half-heartedly, procrastinate or never start.
I’m not sure why this is, I think it has to do with certain mental hold-ups. Getting a job is placing an estimation on your talent, a valuation of your abilities. It’s saying “Your work is good enough to be worth
X$ a month”. I think for many people that’s a struggle.
That’s the whole shtick behind the starving artist; It’s easier to make things that you imagine are of value so limitless only you can comprehend them; Than to allow yourself to be judged by the world.
For other people, it’s simply that they love their colleagues or their boss, and they can’t detach the idea of friendship from that of a business transaction. Yet for others it’s choking up during interviews (hint: experience makes it easier, take anxiety medication, or amphetamines, or alcohol, ymmv). For others, it’s bidding for too high a salary, or behaving like an asshole during the interviews without noticing.
I’m not your therapist, but before you go job-hunting it’s worth exploring your mind and eliminating all irrational hold-outs preventing you from doing it properly.
Ultimately the process of looking for a job may fail. Maybe you’ve spent 6 months looking for an entry-level job and not getting any closer to being hired. Maybe you’re working on-site at various companies for more than 2 or 3 years and nobody will give you a chance at doing remote.
At some point it might be worth calling it quits, there’s no shame in realizing you dislike the idea or aren’t well suited for it.
iv – Some other tips
There’s a lot of things I’m leaving out here, in part because they are the kind of things that, I think, come to you naturally.
Above are the things that young me had a hard time figuring out, not knowing them made me spend a lot of time inefficiently.
Obviously, you need to actually enjoy what you are doing to a great extent. That applies to any job. If you are suffering through your workday you will be both miserable and ineffective, there’s no way around it.
If you’re not enjoying programming but you enjoy 101 other jobs, then do those instead. If you’ve never enjoyed any job, or even the idea of any job, consider re-modelling your brain into something that’s less maladaptive, enjoyment is arbitrary, and most of the things people enjoy in their “free time” are way more boring than most jobs. (hint: spending some time doing it helps, psychedelics help, k-opioid receptor agonists help but are horrible, dissociatives may help, ymmv, careful not to go too mad)
Working remotely comes with a bunch of issues, but in principle, the basic rules apply:
don’t be an asshole
be clear, concise and nice when you communicate
have a schedule
hold thy Sabbath sacred
That should be enough to avoid burnout or being fired, the rest you learn as your go along.
There’s a whole other niche of remote work around sales and marketing style roles, as well as people working remotely as “classical” consultants and contractors. Last but not least, there are creators. These career paths can all work remotely, if you don’t enjoy programming but want to work remotely, give them a shot. I’ve got no idea how to start, so you’ll have to seek some other blog.
If your main aim is freedom and expressivity, being a creative is ideal. If your main aim is money, sales are better than programming (but much harder). If you want something easier with the flexibility to switch into other things later, marketing suits the bill.
Some people will be adamant about building a “portfolio” in the form of blog articles, youtube videos or Github projects.
I don't think this matters much. If someone cares enough to read your GitHub code or read your thoughts, they care enough to give you a coding challenge or do some peer coding with you.
If they don't, it's easy enough to appear like a "good" open source developer having actually done nothing, that nobody will care.
The one thing you might want to do is learn how to pass brain-teaser technical interviews. I hear many websites are teaching this.
I’m not sure which, I’ve only ever taken two “brain teaser” interviews, one was for google, the other was for my first remote role (because I was desperate for remote). I’m the kind of person that has an ego around certain things, and if someone asks me for references before we’ve negotiated a contract or sends me a brain teaser as part of an interview process, I send back a choicely worded email and block them.
It’s a dumb thing that many companies do, so it probably helps to be really good at it. If you don’t want to get good at it, you can always try to “take the lead” during interviews and ask them about what they are actually doing, convincing them to give you a real problem to solve. That’s what I usually did. Even better, you can just interview with companies that know what they want and have an interview process that reflects that, but those are rare, and the pickier you are the harder it is.
Interviewing is a question of how much spare time you have and how much you hate your job. If you dislike your work (or have no work) and have a lot of time to spare, then learn to solve brain teasers very well and take every shitty interview. If you like what you’re doing and your schedule is swamped ignore any company where the CTO doesn’t send you a calendly link in the intro email.
Another thing worth mentioning is that there is a soft cap on remote programming salaries, and it’s pretty low. In theory, it might make sense for remote companies to adopt the SV culture where they offer 7 figures to really talented individuals. In practice, I’ve never seen a remote role advertised for more than ~250k, usually, those are the really hard and boring roles for companies offering no or little equity. If you’re going for something decently fun and relaxed, you can probably aim for 60-120k depending on your skills and preferences, once you’ve got 2 to 3 years of experience under your belt.
<written in 2021, adjusted for inflation, probably won’t apply once (if) NLP coding gets really good>
If you are looking to make a lot of money, you’re likely better off in sales. But programming does allow you to work in a more relaxed environment, and the early start coupled with investing goes a long way, doubly so once you work remotely and can afford low costs of living and low tax rates.
Finally, I’m the kind of person that works for startups, I’ve tried working for large corporations twice and I hate it compared to a startup environment.
I think it’s important to consider the size of companies you want to work for, often time the kind of people miserable in a corporation could feel just at home in a startup and vice versa, but many never try.
If in one or two years’ time this article turns out to be useful to you, do let me know, if by chance you remember. It’s a shot in the dark, but I just couldn’t leave it unwritten.
Published on: 2021-11-11