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.
The plan
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.
Which course?
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?
Ideas:
- 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.
What next?
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
Tech stack recommendations:
Many people who want to build a side project want to build a website that does something, or an "app" that does something (and could just be a website that can be opened on a smartphone).
So I want to add recommendations to save some searching:
Backend recommendations:
I'm much less confident about this.
Things that automatically override this advice:
Paul Graham agrees that building something you're excited about is a top way to get good at technology:
https://forum.effectivealtruism.org/posts/mtBwjfygyAudDakyC/yonatan-cale-s-shortform?commentId=KBeNwzkiAKFp5Lw9T
If I had read this seven years ago, there's a non-zero chance I'd now be a developer with six years of professional experience instead of a developer with a CS degree and three years of professional experience. I'm honestly not sure which one would be better (I suspect the former, but credentialism is a thing) but especially for those who aren't going to get a Bachelor's anyway for whatever reason, this sounds like fantastic advice.
In the event that this post becomes wildly successful and you become overwhelmed with people asking for your help with solving programming problems, I am happy to take some overflow.
Nice post. One suggestion for an area of specialization: web development. Building front-ends and back-ends for websites seems like one of the areas of software engineering with the hottest hiring market and easiest bar for entry. Many coding bootcamps focus on teaching web development skills during a 12 week course, and then immediately recommend applicants apply for a job. If you can build a nice looking full-stack webapp with an API connection to a backend database that's hosted on e.g. Heroku and has the full code visible on GitHub, you have a good chance of being hired as a web developer. From there, you can branch into many other fields of software engineering.
I agree with everything you said about web/fullstack development (upvoted!), I'd just like to push back on "hottest hiring market" as an important consideration. I know this may be controversial, hear me out: It is pretty hard to pick an area of software engineering today where it will be hard to find a job. Picking a slightly hotter area won't make much difference. (And worse: It's a question of supply and demand. Fullstack devs are also relatively common). Anyway, my point is that I think this consideration is over rated, and more importantly, distracts some people from something else:
What's underrated in my opinion? (Within EA) Personal fit within software development.
This is worthy of an entire post, I think. TL;DR:
(Please remember this is only a TL;DR)
My disclaimer would be "if you think you're going to chose a subdomain of software where there is too little demand, feel free to ask about it". For example, I wouldn't recommend learning Pascal. But in practice from the actual conversations I had with EA devs, none of them aimed in a direction I thought was bad.
Still, fullstack is great, has market demand, has EA demand, and in my personal opinion is very fun as well
How come you do not mention open source projects? I don’t know how valuable it is nowadays, but working on e.g. Firefox early in my career definitely helped me learn fast from very good programmers in a real project used by millions. It has been a good CV item as well.
Came here to suggest this. Open source demonstrates to hiring managers that you know how to collaborate, which is at least as important as the technical skills in many cases.
There are even good EA open source projects like microcovid and the template for the EA forum (my nonprofit that builds tech for public policy analysis is also fully open source and welcomes contributors on GitHub, happy to chat with anyone interested).
Thank you! I added a pretty visible title for Open Source and linked to your comment here as my best suggestion for anyone who's interested in this option.
I agree
Assuming there's an open source project someone feels excited to work on, it's an amazing option
I added it to the post
I would be much more impressed by someone who is a regulare contributor to a useful Open source project than someone who built a side project on their own. Working with others, reading other peoples code and having your code go through reviews is something that you wont get working on a personal project.
Nice post! about the mentorship I wonder how much differs the theory from the practice. In my experience even if the employer mentions mentorship on the interview it might well be that there is close to nothing in the real job.
I would be interested in hearing how it was for other developers. If they got much mentorship and how they went about finding companies which offer it.
Thanks!
Regarding the mentorship, note there is a huge difference between asking "is there mentorship" and hearing "sure! mentorship is one of our core values!" to asking specifically "will I have 1 hour per week with a senior dev where I can ask questions that will help me improve?"
There are other questions you could ask too, but more generally this is a very common problem that developers (including myself in the past) fall into, which is why I recommend these questions.
Many hiring managers will, eh, twist the truth about the subjective meaning of "a lot", but way fewer will blatantly lie to something completely objective and factual such as wether they do one-on-ones (and in what frequency and so on).
Adding: If they do blatantly lie about that, I'd aim to open a conversation about it within the first week and probably quit before the second week is over. Better not stay in such a manipulative relationship.
(We may discuss the specifics which I totally oversimplified here, but you get my direction in general. Too many devs are stuck in places like that, and if my post helps just one of them, then this was all worth it)
I also have things to say about "how to get good mentorship given a specific job", but decided that would be out-of-scope for this post.
Thanks for the detailed answers. I would be interested in hearing more about "how to get good mentorship given a specific job" in case you can redirect me to a particular article or similar.
May I user test my mentorship article with you once I have a reasonable draft? :)
(If you're in that situation right now and prefer not waiting, consider contacting me directly. Maybe we'll write it together!)
Sure, I sent you an email
"I don't even have a CS degree":
People who tell me this in the spirit of telling me a great disclaimer, please note that I don't actually recommend CS degrees to anyone [except rare exceptions].
May I ask why you do not recommend CS degrees?
I'm not sure how to answer this so I'll give it a shot and tell me if I'm off:
Because usually they take more time, and are usually less effective at getting someone hired, than:
For example, in Israel pre-covid, having a CS degree (which wasn't outstanding) was mostly not enough to get interviews, but 2-3 good side projects were, and the standard advice for people who finished degrees was to go do 2-3 good side projects. (based on an org that did a lot of this and hopefully I'm representing correctly).
There is more that I can say about this, but I'm not sure I'm even answering the question.
Also note that the main point of this post is to recommend people do side projects, as opposed to recommending they don't get a CS degree. Maybe another point is "don't try to learn all the topics you heard about before you apply to any job", which is also important.