So you want to be a computer scientist?
If I got hit by a bus and forgot everything I knew about computer science [1], here is howâd I re-learn it [2].
Inspired by Robert Heatonâs âProjects for Advanced Beginnersâ (link) and a bunch of random knowledge Iâve accumulated over time.
âźď¸ Are you already someone with knowledge in the field of computer science, and looking for resources or opportunities? I encourage you to look at csjobs2 instead. This is my curated list of every-resource-ever I considered in undergrad, and has suggestions for wannabe engineers, PMs, VCs, etc.
Letâs get to it.
First: the number one thing to understand is âcodingâ is something you learn by doing. There is a lot of theoretical stuff to know (âwhose importance varies with your goals), but fundamentally you need to code. A lot.
So, letâs âlearn by doing.â To give that some structure, your curriculum will come as a curated list of projects. This will be supplemented by things to read or look at when you get board. And then some philosophical advice how to have your projects be more than a tree that falls in the forest.
First, some principles.
Principles
-
Digital assistants (Claude, ChatGPT) are good, but you can only use them like a university TA. That is, they cannot write code for you, you cannot copy text from them, etc., but you can (and should) ask them explanatory questions.
â âWhat does this bit of code do?â âAny hints for whatâs wrong with my approach to this problem? DO NOT OUTPUT THE ANSWER. (problem) (approach)â
â âWrite a webpage skeleton for me,â âoutput a function to reverse a linked list in Pythonâ
You should use digital assistants (âŚyou have a literal TA available at your disposal 24/7), but you must use them correctly. Discipline is key!
-
You also must disable any code âcompleteâ tools (i.e., anything that writes code for you in a text editor).
Imagine learning to bike but never being able to take off the training wheels. Would you ever be able to do cool shit, like a wheelie?
For example, if you use Visual Studio Code, add this in your editor.
javascript// at .vscode/settings.json { // ... "github.copilot.enable": { "*": false } } -
You journey must be in public. Once you finish a project, deploy it to a URL, post it on LinkedIn, Twitter, etc., send it to your friends, your mom, your dog, etc. Get people to use it, give you feedback, and fix their bugs. (This will pay off dividends down the line.)
Need a community of people to do this with? Look at Summer of Shipping, various sub-reddits (e.g., r/dailyprogrammer), or Discord communities.
4. Have fun!
Curriculum
Your first task will be to build a website. Not using like, Framer, or Bubble, or even Notion, but with HTML (âHyperText Markup Languageâ for page structure and content) and CSS (âCascading Style Sheetsâ, for style).
Why a website? This will serve as your digital playground. Youâll build it, then re-build it, then re-build it again, and again, and again. Each iteration will represent a new milestone in your learning. Each feature will be a test of your knowledge.
âBut Michael,â you say, âI have no interest in being a web programmer!â Good. You still need a website for sharing your work. And basically every project you make can (and should) be hosted or have an entrypoint on your website. (Think a âdownloadâ link for your desktop app, or a landing page for your mobile game.) In addition, a lot of frameworks support cross-platform development today, so you might be able to accidentally be good at web programming. Which is also good.
Here are some resources you can use to get you unstuck.
-
Khan Academy (very basic, just to get you startedâwatch a few videos, they have a nice online playground)
-
MDNâs web docs â this is the one youâll actually use to make your site. Read everything on here like a sponge. Do âYour first website.â
-
Frontend Masters (more advanced, as you start to want to do fancier things with your site)
If you finish your website, I know youâre serious. Exciting! Go to GitHub.com and make an account. Create a ârepositoryâ and upload your code there.
Still a student? Skim through these resources and see if anything looks interesting. (For example, you can get 6 months free to Frontend Masters!)
Next, Iâm going to hijack your social media feeds. Subscribe to all these people.
-
The Coding Train, 11/10 programming tutorialsâsort by popular
-
Fireship, light educational content and tech culture
-
Computerphile, fun, advanced content
-
3Blue1Brown, math and computer science
-
(âŚmore to come as I think of themâŚ)
This is a very passive way to supplement your learning. Hijacking my social media (with gym bros instead of computer scientists) helped a surprising amount when I started going to the gym.
OK, next, youâre going to work through some practice problems to learn a language a bit harder than HTML and CSS. (Practice?!)
Your choices are JavaScript or Python.

-
Practice-Itâ CodeStepByStep (do this first)- (Iâm working on getting an instructor code. Once I do that Iâll add it here.)
- For now, CodingBat is a good beginner introduction. Then look at Codeacademyâs courses.
-
Advent of Code (do this every Christmas; work through as many days as you can)
-
Grind 75 (once you need a job, becomes especially relevant)
Pick a few problems a day, as many as you can muster. Theyâll be boring at first, but quickly get interesting. This will help ease you into language âsyntaxâ (i.e., how to âspeakâ it).
Consistent practice is key! Even a minute can be enough, just to give you continual exposure.

This learn-by-doing approach sometimes hits a roadblock. Here are some resources for either language to help aid your learning.
JavaScript
Python
Hereâs a kind-of checklist to note down your progress.
-
Run a program, output to the screen (
print,console.log) -
Store information in variables (
x = 5) -
Do basic math
-
Work with text (âstringsâ), do basic operations over strings
-
Write logic with if-(this-else-that)-statements (some people call this âcontrol flowâ)
-
Use lists to store multiple items (
[âhelloâ, âworldâ]) -
Write logic with loops (each
for <N times>: print("hello")) -
Create functions to organize and name your code
-
Read and write to files (text files, CSV filesâi.e., a spreadsheet)
-
Get input from users
-
Handle basic errors; learn what an âexceptionâ is
-
Install a use packages from the đ internet đ
-
Organize your code into multiple files
Okay, enough reading (talk about boring). Itâs time to get back on the project train.
Projects
Here is a list of projects. Some advice:
-
Make these projects your own; Iâve intentionally left them rather underspecified, so use your creative freedom. Have fun!
-
Every time you finish: (1) make sure itâs on GitHub, (2) deploy it to a URL, and (3) share that URL everywhere you can think of.
- As a bonus, if you know someone whoâs ânice with computersââhave them review your code and give you feedback.
-
Donât spend too long on any of these.
-
(Also another bonus tip: itâs okay to implement a kind-of dumb feature if it lets you practice a code coding language feature you learned. Itâs about practice.)
If any of these bore you, skip âem. Again, itâs about your learning. (I think theyâre fun though.)
Hangman
Implement the game of Hangman using your language of choice. The way it should play isâŚ
- Press âstartâ
- Have an input to either guess a letter, or guess the entire word
- If the player guesses a letter, either
- Mark off where that letter is
- Or add a body part
- If the player guesses a word, either
- They won!
- They lost :(
- If the player guesses a letter, either
- Repeat (2) until they either win, lose, or finish the body parts
The generate text output, you can Google for Hangman âASCIIâ art.
As an extension: make a mode for two players, where one player can choose a word and mark off the appropriate letter positions.

Conwayâs Game of Life
Itâs not really much of a game, more like an art piece. Hereâs the description.
The Game of Life, also known as Conway's Game of Life or simply Life, is a cellular automaton devised by the British mathematician John Horton Conway in 1970. It is a zero-player game, meaning that its evolution is determined by its initial state, requiring no further input.
You start with a 2D grid of squares, either filled or empty. You determine the next game state via the following rules.
1. Any live cell with fewer than two live neighbours dies, as if by underpopulation.
2. Any live cell with two or three live neighbours lives on to the next generation.
3. Any live cell with more than three live neighbours dies, as if by overpopulation.
4. Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.
Your game will consist of code to render the grid, and code to determine the next grid state.
As an extension exercise, try figuring out interesting starting positions for yourself!

Tic-Tac-Toe
Now that you have some experience with more interesting game states, letâs try tic-tac-toe.
The game should support keeping track whoâs winning (player 1, or player 2) after multiple rounds. Itâd also be cool to be able to track the gameâs history, and jump back in time (âundoâ).

Snake
Last but not least: snake!
Implement the classic game in your terminal. Make sure the user dies if they hit themselves, or hit the wall.
As an extension: implement a Tron version with two playable snakes.

đ STOP! đ We must take a non-coding interlude. This is the point at which you can create a very basic resume, that lists out the few projects you have here. But youâre not allowed to do it in Word! Oh noâwe use much more annoying tools in this discipline.
Go to a website called Overleaf. Google âOverleaf latex resume templatesâ and scroll through to you find one that (a) you like and (b) meets these strict requirements:
- Single column.
- Has the following sections: experience (or equivalent), education (or equivalent), projects (or equivalent).
- Does not have: a profile photo, an âaboutâ or âobjectiveâ section.
Then, edit the template to match your content. LaTeX (the language youâre now looking at, after forking the template), is a bit trickier than HTML, but a similar kind of mark-up language. Iâll make an exception to my Principles for a brief moment: you can get ChatGPT (or equivalent) to help you as much as you like with this one. LaTeX is not something youâll need on a job, but is good for writing very nice docs (and just is something you should know).
Alright.. back to some ⨠more advanced ⨠projects.
Digital Analog Clock
For this one, youâre going to make a analog clock, by digital means.
Your end picture is going to look something like this.

(âŚwith the hands actually moving.)
To do it with JavaScript, I recommend using Processing.js.
To do with Python, I recommend using Pygame.
You can compute a lot of stuff manually, but this is a first example of where a little bit of math will go a long way to simplifying your code. Time to pull out that high school trigonometry knowledge!
Blog
Itâs been a while since weâve taken a look at your website. Your next project will be to add a blog! Itâs okay if you donât write (âŚbut you should!); this is just a good way to extend your web development skills.
To make the blog, create a folder on your website that has a series of Markdown files. Markdown is sort-of like a stripped down HTML, useful for writing documents. Your website should take those files and âturn themâ into a series of web pagesâthis technique is usually called âstatic site generationâ (static because it happens at build time; not dynamic since you canât update the blog post in real-time).
You'll almost certainly need JavaScript to do this, though there are options for Python (look-up Pelican). For JavaScript, you have many options: considering learning React.js (and it's âcousinâ Next.js).
You can also choose frameworks in other languages, like Hugo (which uses Go). Your options are plentiful here! Feel free to do some exploring yourself. (It's your website!)
As an extension: try hosting other kinds of content from your website (e.g., a photography portfolio).
AI-Kinator
AI is all the rage now. But did you know using ChatGPT via code is as easy as this?
import openai
openai.api_key = 'your-api-key-here'
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "What is the capital of France?"}]
)
print(response.choices[0].message.content)
An API key should always be kept private. It is your secret key for accessing a (usually) paid or private service.
Go get one for ChatGPT from here. Add a tiny bit of money to your account (I think $5 is the minimum).
Now weâre going to re-make our own version of the Akinator. Except for yours, youâll use ChatGPT as the all knowing Ak. Youâll have to do quite a bit of Googling to figure out how to use the API effectively, but the core idea is quite simple. Prompt is to ask you questions to guess the person youâre thinking of, in a loop up to 20 guesses.
Text Omegle
Omegle was a video chat mired in controversy. It got shut down recently by its creator.
Your final project will be to make a non-video version! The app should work as follows:
-
A welcome screen where users can put in a keyword
-
If someone else has put in the same keyword, theyâre placed in a room
-
They can chat, until either user disconnects
Extension work can include giving either user a bit beefier of a profile (e.g., a profile picture, bio), and smarter matching for non-exact-but-kind-of-matches (e.g., âamerican footballâ, and âfootballâ).
Finally, here are some fun extensions to take depending on your interests.
Interested in data science or machine learning? You may want to beef up your math foundations a bit. Khan Academy, MIT OpenCourseWare, etc., have a ton of machine learning offerings. Kaggle is also a good resource for getting real-world experience.
Interested in game programming? Make games! Worldâs your oyster here. Weâve mostly done 2D stuff, but you can install Unity and venture in 3D programming. Gamejamâs are a good way to build your skills quickly.
Interested in web development? The âclassicâ web dev next project would be a todo list. If you didnât already, learn some JavaScript and then tack on a framework like React. Reactâs tutorial is a great starting place. You should also get Frontend Masters.
At this point, if youâve really stuck to the plan, youâre ready to move on from this guide. Here are some resources to continue along your journey.
-
roadmap.sh, a collection of developer roadmaps (i.e., career path â learning track)âvery helpful!
-
Learn math â Khan Academy, Numberphile, 3Blue1Brown, MIT OpenCourseWareâs stuff, Aelphâs guide (to get advanced)
-
Learn computer science theory â Computerphile, 3Blue1Brown, MIT OpenCourseWareâs stuff (to build up a make shift degree), and the ultimate resource: teachyourselfcs.com
- If you want to be a capital âSâ scientist, that last one is your best bet with structuring the sea of resources on the web
- âŚbut this hands-on start is a way to make sure you can actually build something before you get lost in the definition of a hashmapâwhich I think is the way to go (have fun and make things first, then cut away at layers of abstractions through a great education)
-
Get a job â csjobs2, the other doc of mine that I send people a lot, which is a compilation of resources for levelling up in industry
Remember: the only way to get better is to keep programming.
Thanks for reading! Find this valuable? Hate this guide? Have a funny joke youâd like to tell me? Feel free to drop a line at michaelfromyeg [at] gmail [dot] com.
Edit (2025-01-05): I recently stumbled across Peter Norvigâs Etudes, which has a number of additional small, but difficult programming project ideas.
Re-implementing one of these and then comparing your solution to Norvigâs would be an excellent way to continue your practice.
Footnotes
[1] Doesnât that sound nice.
[2] Oh god.