Error
Unrecognized LW server error:
Field "fmCrosspost" of type "CrosspostOutput" must have a selection of subfields. Did you mean "fmCrosspost { ... }"?
Unrecognized LW server error:
Field "fmCrosspost" of type "CrosspostOutput" must have a selection of subfields. Did you mean "fmCrosspost { ... }"?
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:
My usefulness as a developer is very much effected by my skill.
The speed I build skill is very much effected by how much my job interests me.
(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
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
Updates [Feb 2025] :
Two big things seemed to have changed:
Things in the economy make it harder to find jobs (different things in different countries. Perhaps this isn’t true for where you live)
AI coding tools are getting pretty good (just wait for March 2022)
Also, I’ve hardly had conversations about this for a few years (maybe 1 per 1-2 months instead of about 5 per week), so I’m less up to date.
Also, it seems like nobody really knows what will happen with jobs (and specifically coding jobs) in the age of AI.
If someone can suggest an example task they don’t think an AI will be able to do in 2-3 years (in the context of picking a career, ideally in software), I’m interested. (we can elaborate in the comments if you want)
Also, it seems like AI coding tools today can mostly do whatever a developer with 1 year of experience could have typically done (without AI tools), and I assume that in another 1 year this will be true for developers with 2 years of experience. This isn’t literally true for all developers or all tasks, but I think it is one way to “measure” AI progress in a way that is relevant for picking a career (an imperfect measure, but there seems to be a lot of confusion).
Also, companies that are open to online applications seem to be spammed with LLM generated applications. The market will probably adjust to this somehow, but the current situation seems unusual.
With all that uncertainty, I find it hard to give career advice.
I’m tempted to say “I don’t know”.
But I also think that there are uncertain suggestions that are definitely worse than others, and it is really hard to find reasonable directions to get in to software alone, so here are some of my opinions, and others can happily comment if they disagree.
The bar for getting a first job seems to have gone up, not down.
The bar used to be (vaguely) 2-3 good side projects, or perhaps some impressive STEMy thing (which is common but there are so many special cases that I’m not sure how to summarize them).
If your CV doesn’t get replies and you don’t have side projects, that is still where I’d start.
I’m not sure if side projects have a different weight now that AI coding tools can help, but my guess is
The same reasons that side projects were valuable still apply
Perhaps if making side projects is easier then the expectation is to have more of them, or better ones
Knowing how to use AI tools matters
AI tools aren’t a magic bullet, they still require skill, and hiring someone who knows how to use them—seems to me relevant to the person’s expected productivity
Not all companies moved to using AI tools (or perhaps they are using out-of-date tools), which seems crazy to me, especially given that often after I sit with someone and show them what exists—they change their mind. This might be a too-hot take, but I think companies that don’t use AI tools will stay behind (if their tech velocity matters).
Knowing how stuff works still matters
My recommendation (for this stage of your career) is still “learn the stuff you need for your side project” which is very different from “learn anything that could be called basics”. But still, there are things to understand.
Working on stuff you’re excited about still matters
How much to use AI tools when learning?
I’m not sure
If the AI is producing code that you don’t understand and also doesn’t work and you don’t know how to fix then this is probably pretty extreme into the “using too much AI” direction
Remember that the reason for your bug might not be the last prompt you sent but rather something earlier in how the AI set up your project
Using the AI to automate things that you know how to do, that you fully review and understand and often correct small mistakes—seems like definitely not too much (and perhaps ideal).
Asking the AI what is the best way to do X, or trusting that it picked a direction that makes sense—is probably a mistake (as of Feb 2025). Official docs and tutorials are still much more reliable.
When you don’t yet know how to program anything (e.g before you made your first program, probably assisted by an online course), I probably recommend not using AI at all (unless you feel like you can actually review it reasonably, which seems hard to me)
Skills that AIs don’t currently have
Currently an AI can’t be “a responsible employee”
Soft skills like “have a TODO list so you won’t forget tasks that your manager asked for” or “tell your manager if something is taking longer than planned instead of hiding it and pretending everything is ok” seem still important
Currently AIs aren’t good at architecture
More generally, I think a nice property of doing a side project is that it “forces” you to learn whatever skills the AI doesn’t have in order to accomplish the goal of building something that works
If you like leetcode...
It seems like some companies are dealing with the flood-of-CVs by sending leetcode questions. I’m not sure if this will last (since people can cheat by using AIs), but maybe if you’re able to blast through leetcode questions, that will distinguish you.
I don’t recommend this as a default path, but if you’re excited about leetcode then excitement matters
I’m interested in more comments/opinions. I might comment more here myself
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:
React. You can learn react from their official tutorial, or from an online course. Don’t forget to also learn any prerequisites they mention (but you don’t need to invent your own prerequisites)
If you want a React competitor, like Vue, that’s also ok (assuming you’re more excited about it).
Choices I don’t think are legit: JQuery, vanilla javascript.
I can elaborate.
(If someone sent you to “learn the basics” then I probably disagree with them. Yes it has value, but it’s not the most effective path to a first job with mentorship nor to getting far in 5 years. There are other times to learn these things which are not “before your first job”)
For graphics (making your website nice)
If you don’t care about graphics, you can skip all that (including css)
If you don’t want to put effort into graphics but you want your website to look nice anyway, you can use Material UI or Bootstrap. They have ready components like a pretty button or a pretty checkbox, you just import them and only do minimal customization like “hey checkbox, you’re disabled by default”.
If you think making a pretty website is really cool and is obviously the exciting thing to do: you can learn css, and perhaps Tailwind. This isn’t a path I took myself and I don’t know it well. Just remember—it’s a higher priority to get a first project done even if bad and ugly. But as part of “looking for things that excite you to learn more”, graphics might be one of them
Deploying (having a url that you can send to your friends, or put on your CV)
Firebase Hosting
There are many fun ways to deploy websites, including React, I’m specifically recommending Firebase because you might want to use it to solve other problems too (which I might write about).
Backend
If you mainly wanted to make a website-that-does-something, I’d start with that before getting into backend. Once you reach this point on a real project, check if you actually want to continue here. The main important thing is that you work on something that excites you, so you have my official permission to leave your project “not perfect”, without a backend (even if it needs one), if you think that part will be less fun.
Main things a backend will give you (written here so you can check if this seems exciting or meh)
User login
Communication between users (for example if it’s anything like a chat)
Saving information that will still exist if you open the website in a new browser (for example, if you have a TODO list, you probably want to see the list both in your phone and in your computer)
((I might continue in a sub-comment))
Backend recommendations:
I’m much less confident about this.
If you want a working backend with minimal effort, because actually the React part was the fun thing
Firebase (Firestore) :
This gives you, sort of, an autogenerated backend, if only you describe the structure of your database. I’d mainly recommend this if you’re not interested in writing a backend but you still want things to work as if you built an amazing backend.
The main disadvantage is it will be different from what many databases look like.
You could skip the “subscribe for changes” feature and only use the “read” feature and it will be a bit more realistic, but I don’t actually recommend that.
If you want to write backend in a way that will push you towards best practices, using a technology that is very popular (and specifically documented well for beginners)
Django
A big disadvantage is you’d need to learn some pyhton, and you might be reading this because you already built a fun React project and you want to get it done without learning lots of new tech
DB:
Postgres is the default normal DB for most use cases. SQLite might be easier for local development (on your laptop), and is missing some features that you’ll almost surely not notice, so please don’t care about them until a concrete problem comes up.
Things that automatically override this advice:
If you’re picking technologies for your startup or something then remember this wasn’t written for you.
If you have a senior developer who will mentor you if you work on some different technology that they know well, then probably go with them.
My new default backend recommendation, assuming you are mainly excited about building a website/webapp that does interesting things (as most people I speak to are), and assuming you’re happy to put in somewhat more effort but learn things that are (imo) closer to best practices, is Supabase.
Supabase mostly handles the backend for you (similarly to Firebase).
It mostly asks you to configure the DB, e.g “there is a table of students where each row is a student”, “there is a table of schools where each row is a school”, “the student table has a column called school_id”.
It can also handle login and permissions just like Firebase.
I think learning to use an SQL database (like Supabase which uses Postgres behind the scenes) is somewhat harder than a no-SQL database (like Firebase), but SQL databases teach more relevant skills.
(FYI this is an opinionated take and some might disagree)
“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.