This post has something strange going on:
- When I give people this advice face to face, it helps, they change their path, say it saved time and/or focused them and/or they say "seems obvious in hindsight". I'll call this situation "works"
- When people read this at home, they think it's meant for someone else. I call this "doesn't work".
- When people read this while sitting next to me, either physically or virtually, it again does work
I don't know what's going on here.
I recommend brainstorming a solution for 1 minute before you start reading. Maybe read with a friend? Maybe have a friend read and them ask them your question and see if they can answer? Maybe pre-commit to give me feedback on what did or didn't work? I don't know
As a person who offers mentoring to EA developers, I’m often asked what to do before one’s first paid job. This post describes the fastest path I know to make progress both in the short term (get paid) and in the long term (what to do now in order to be really skillful in 5 years), a path that works for many people and requires zero prior experience in software development.
If you want to be a professional software developer but you’ve never had a software development job before (and you can’t just apply and get one), then this post is for you.
An overview of the plan:
- Do an online course [link]
- Write 2-3 good side projects [link]
- Apply (to companies where you'll get mentorship) [link]
I’ll go over the common questions that come up, such as “which side project?”, “why get a job instead of doing something else?” and so on.
Did you get other advice? Then maybe ignore this post
If you got customized advice from a friend who's a senior developer, who took your specific situation into account, and wasn't trying to sell you anything, then listen to them, not to this article.
Or, tell your friend "Hey, I heard that doing side projects is really good, what do you think?", and then go with your friend's opinion, whatever it is.
Example custom advice that would override this article
- Your friend offers to mentor you one-on-one
- Your friend reminds you that you did data science in your Masters’, which you could use as a shortcut
- You think you might be able to get accepted to some job right now, maybe it's hard to tell in advance, but it's cheap to check.
Do you read lots of advice like this? Then maybe skip this post
A common failure mode is to get one piece of advice about reading some book, some other advice about doing a course, a third piece of advice recommending doing a CS degree.. and you end up waiting until you finish ALL OF THEM before you apply to any job.
If that's your situation, then reading this article will probably be net harmful because it will only slow you down. If this article has made your plan longer and not shorter, then it has failed.
TL;DR: Get a first paid job. I will discuss why and how
The rest of the post is structured as a Q&A based on the most frequently asked questions I get. I recommend you only read the sections that interest you by using the menu on the left.
Q: Why is getting a paid job so good? [skip if this is obvious]
Assuming you want to be a software developer, your goals will be easier to achieve if you're a skillful (productive) developer. So especially early on, I would focus on building skill.
One of the best environments for building skill as a software developer is being surrounded by one or more skillful developers who are interested and able to help you learn how to be productive. This often naturally happens once you have a paid job: Suddenly you’re surrounded by people who have an incentive for you to become productive as quickly as possible (yay!).
Common mistake: Trying to improve by learning “random” skills rather than doing whatever will help you get a job with good mentoring. [skip this section if you’re not planning to do this]
Of course, you will probably have to learn alone in order to get that job. However, the mistake is learning things “randomly” that “seem generally useful even if not the most useful” or worrying that “if you don’t learn some topic now then you’ll never again have a chance to learn it” [I have a lot to say about that] rather than focusing on what’s needed to get a job (with colleagues who can mentor you).
The most common way this mistake materializes is: You talked to some senior developer who told you about some resource for learning programming that they like, such as a blog / special tool / speed typing / a book / whatever. The problem is that there is an endless stream of similar resources, so the more recommendations you get, the more it will potentially slow you down from getting a job. You talk to one extra person → you get an extra few weeks or months of learning materials. There are endless things to learn, you can’t learn it all, you’ve got to prioritize.
I’m specifically against such advice (to learn/read something) if it was said in the spirit of “this is something you’ll eventually have to learn some day” as opposed to “this is the most effective thing for you today”.
Disclaimer: I do recommend doing things that you like to do [I can say a lot about this]. If you want to learn something else, consider doing a side project in that instead. But most people I talk to learn “random” stuff that they find boring, which is the worst of all worlds.
Another great reason to get a job: Money.
It’s pretty great.
Q: How to get an entry level job? (A: Do side projects)
If you don’t know how to program yet and can’t build a side project, see this question below.
This advice is based on the Israeli tech ecosystem, and specifically on an organization that has helped lots of developers get their first full time paid job. Here is the unofficial gist of their advice:
- Build 2-3 good side projects.
That's it. Add them to your CV and start applying.
Which side projects count as "good side projects"?
- Doesn’t count: School projects / guided projects from a course or degree.
- Does count: A project that you thought of yourself + You didn’t know how to implement it when you first thought about it. In other words, it required you to learn new things.
- Amazing but not a must: A project that one other person will actually use.
If you have more questions about the criteria, feel free to ask me (or someone else).
An important part of these side projects is having something to talk about in interviews, and specifically:
- Explaining how you approached a technical problem, for example “I wanted to build a chess game, so I thought about how I’d represent each piece, …”
- Explaining a technical challenge you had and how you approached it. You will have lots of them, it’s expected (in case you thought it’s bad that you have problems - it’s not) and it’s a very common thing interviewers ask about.
Side projects also show employers your commitment and enthusiasm towards building things and improving as a software developer even without an external guiding force (which is why school projects don’t impress employers as much). This is in addition to being an effective way to improve your skills writing something “real”, as opposed to doing something that is less like actual development work.
Adding: Working on an open source project that you're excited about is also a great option, thanks Markus!
Q: Where to start when thinking of a project (what to build?):
Imagine you'd already know how to program in everything, what would you like to build tomorrow?
Feel free to ask for help in refining your idea, though I expect to mainly say “that sounds great, where would you start?”.
If you’re having trouble finding an idea, please comment or message me.
Q: All the good projects were already written, that's what the market does, how could I possibly come up with a good project idea?? (skip if this isn’t relevant for you)
TL;DR: Markets basically only build projects that can make lots of money. Build something that can't make money.
A good starting point: Build something for yourself or for your friends, maybe something so customized that it wouldn't be worth any company's time to focus on it, or something fun that nobody would pay for.
Q: What about this other thing I'm doing that isn't "build a side project", like learning math?
If it's not effectively bringing you to a situation where you can build a side project, then it might not be effective for your career (though use your judgment. I'm writing this based on past conversations and I don't know your situation). Note I am not saying that your other thing has zero value - but many things have some value, and we can win lots of points by picking not just what has "some non zero" value, but instead "the most" value. This is the Effective Altruism way, no?
Q: How to get to a level where I can write a side project?
Take an online course (assuming that’s a thing that could work for you).
If you’re already able to write a side project (with help from people and from the internet), then skip this stage.
I’m not against bootcamps but I have no specific recommendations and so I’m leaving them out of scope for this post. Also, they’re complicated to vet. Also, online courses are great.
Q: How to pick an online course
Which programming language?
Just like picking a project, Imagine you'd already know how to program in everything, what would you like to build tomorrow? Pick the technology that will help you build that.
Please ask for help here if you’d like, and I (we?) will try to fit something for you.
Most courses on Udacity / Udemy / Coursera (that have good ratings) are good.
The important thing to know is that there's an element of personal-fit:
Some courses will let you practice every few minutes, some will let you learn lots of theory and then build a project at the end.
Some courses are fast, others are slow.
Some dive into the details of each symbol, some teach by building an example project (like a TODO list for example).
It's common for the first course one picks to be a bad fit somehow, so this is a reminder from me: You can totally switch courses. Almost all your knowledge will be relevant for the new course as well, and there won't even be a significant sunk cost apart from having to look for another one.
Also, if your course is too slow, you can skip ahead. If it's too fast, you can repeat parts. All of those things are totally legit and are a result of different people preferring different things, and course-makers not being totally perfect. Customize your course.
Q: Side projects: What else to know about them?
Finding someone who can help with problems you encounter is very useful. It might be hard to ask for help, but it will optimize your process a ton.
I will write a simple example to explain what I’m talking about: You can easily have problems that will take you days or weeks to solve but someone else can solve in ~15 minutes, and these often will not be weeks that you spent well learning a lot. I know that sometimes working a long time alone on a hard problem is a useful learning experience, but this is usually not the situation when taking one's first steps in software development.
A naive example is “googling the error message is useful”, which is something that if you don’t know could get you stuck on for a ton of time. But someone else could resolve it quickly while also teaching you something that you’ll use in the rest of your career. The "shortcut" of asking someone - will often teach you something useful.
You could also try: "Hey, I have problem X, do you think this is a kind of problem I should try solving myself or ask you for the answer?".
Q: How to find someone who’ll help with a side project?
- Ask a friend
- Post in an EA Software group
- Ask me (there is some amount of help I’m happy to give)
- Open a group called “Yonatan’s project” (with your own name, preferably), and invite your software developer friends to join and potentially comment on your open questions or updates. I especially recommend this if your friends are happy to answer specific questions if you have them, but they don't want a high commitment like “being your official mentor”.
Another common mistake: Doing frustrating things
Your motivation is an important limited resource. If you find yourself doing something frustrating, I recommend stopping (hopefully before it becomes frustrating). Ideally you'll talk to someone external, even if they’re not a developer, perhaps they can help with rubber ducky debugging. Or you could talk to me.
Often there is a way to work around frustrating problems.
Also, there are nontrivial meta skills around “how to enjoy software development”, and one of the basic ones is avoiding putting your brain in a situation where it’s getting negative reinforcements for doing software development.
This post should get you to a situation where you’ll get invited to interviews.
Here are some of the next steps, as summaries and not as fleshed out as the previous parts of the post:
- Write a CV.
- Get some people to review it, ideally with this.
- Send your CV to lots of companies
- You’ll have to practice interviewing, so start with the companies where you don’t mind if you don’t pass
- Practice interviewing
- You’ll get questions that you don’t know how to answer, and you can take them home and learn them
- A common failure mode is spending a ton of time in advance, studying for questions that you’re not sure people really ask. More generally, interviewing is a funnel, and your resources are better spent on actual bottle necks
- How to find your bottle necks: Apply, and see where you reach. Do they reject your CV? Do you fail leetcode questions? Is it the HR interview? Is it telling about your project? It’s hard to guess in advance, and people often spend time on the wrong thing
- Ask about mentorship
- For example, “will I have 1 hour per week with a senior developer who’ll help me improve?”. This alone will rule out many companies
- Start working!
- There’s a ton of things to say about this stage too, but it’s too far out of scope for this post
Thank you for reviewing an earlier draft of this document: Jeremy Pesner, Sophia Zheng, Neil Kakkar, Eliza Brandt, from Bountied Rationality.
All the mistakes are mine. All the reasonable sounding on-point English is theirs.
P.S - Open Source
As some commenters mentioned, contributing to open source is also great and takes a similar place to side projects. It's a great way to learn, and also something that can get you to interviews, and that you can talk about during the interview.
I don't have a ready section or reference about this (such as how to get into open source) - so for now I'll say that if you find the idea fun and exciting, and it doesn't sound like an annoying chore - then I totally approve, for what it's worth.
If you're interested in this direction, Max offered help in the comments