For some reason, you might have some free time. Maybe you’re facing unexpected unemployment for this summer. Maybe your plans of traveling and eating your way through Mexico got canceled. What can you do instead?
Side projects are a great usage of down time. I’ve already written about the general process of starting a side project. Here’s a few specific projects to get you started.
A personal site is a great way to improve your web development skills and create an online presence for yourself. What’s great about a personal website is that you can constantly remake it. I’ve made and remade my personal site quite a few times. I’ve done it in raw HTML, in Jekyll and in React. Each time it taught me some new part of web development.
In theory a personal site is useful when applying for jobs because people can look at it and get a feel for how awesome you are. I’ve never received any evidence that hiring people have looked at my website, but hey it’s still nice to make.
Basic: Create a site with a static site generator like Hugo or Jekyll
Intermediate: Create a site with raw HTML and CSS
Advanced: Create a site with React/Vue/Angular
Another common web dev project. I’ve done a few iterations of these, including the blog you’re currently reading. You can use a static site generator, such as Jekyll, which this site uses. You can use a dynamic framework like Rails. Heck you could just write plain HTML!
Building a blog in Rails is a great way to learn it. It’s the tutorial that the official Rails documentation follows. Maintaining a Rails blog? Kinda annoying. But then you can remake the blog with Jekyll or Hugo.
Basic: Make a blog with Hugo or Jekyll
Intermediate: Make a blog with Rails
Advanced: Make a blog with Node/Go/Rust/etc.
CRUD Web App
This is kind of a catch-all but any sort of website that exhibits create-read-update-delete functionality. This could be a blog like above, a shopping app, a newpaper website, whatever you want. I built a site for the Stuyvesant Spectator in Rails and React. It taught me a lot and gave me some experience writing an app from start to deploying.
Basic: Make a CRUD site in Rails
Intermediate: Add on a UI framework like React
Advanced: Deploy it!
Writing an interpreter or compiler is a crucial rite of passage for a programmer. Yet NYU doesn’t teach it in the regular undergraduate CS curriculum. Honestly it’s a pretty large hole in the CS curriculum.
This may seem a little daunting. Programmers tend to think of the compilers/interpreters that they use every day (javac, clang, gcc, node, python, ruby) as black boxes. But it’s really not so bad. Just take it one step at a time—Rome wasn’t built in a day.
Fortunately there’s some great resources out there! Namely Crafting Interpreters. Crafting Interpreters is a wonderful book on writing an interpreter. It’s completely free online and extremely easy to understand. Plus it uses Java so you really don’t need too much experience to get started.
After playing with Crafting Interpreters you can strike out on your own. There’s a bunch of info on interpreters and compilers on the internet, of varying quality. Eli Bendersky and Lambda the Ultimate are good blogs although I’ll admit I don’t always understand their posts. You could follow other tutorials like Kaleidoscope. There’s other books as well like the famous Dragon book or Engineering A Compiler
Compilers are slightly trickier than interpreters in my experience. There’s a lot of complications around typechecking and code generation. The best way to get started is to look at other compilers such as TypeScript, Rust and start writing code.
Basic: Follow Crafting Interpreters and write the JLox and CLox implementation
Intermediate: Follow Crafting interpreters and write a Lox implementation in a different language
Advanced: Write an interpreter or compiler for your own language.
Contributing to open source is another great way to get experience and gain some connections. Chances are you use open source software all the time. Pick one piece of software, whether that’s Python, PostgreSQL, React, Redux, etc. and find the repository. Usually it’s on GitHub. The repository will often have a document called CONTRIBUTING.md that explains how to contribute. If not, try getting on contact with one of the maintainers. You can look for GitHub issues tagged with something along the lines of Good First Issue.
Another good pathway to open source is finding bugs. I’ve had situations where I’m using a library and come across some problem. Maybe there aren’t TypeScript definitions. Maybe there’s a bug. Maybe the author hasn’t extended it to my usecases. Either way, this is a perfect time to submit a pull request to fix this problem.
Your friends’ and classmates’ projects also count as open source projects! For instance you can contribute to Schedge, an API for Albert. Or take one of your projects and make it open source! Usually that means giving it a license, creating a contribution guide and reaching out to potential collaborators.
Basic: Work on your friend’s open source project
Intermediate: Find a largish open source project and work on it
Advanced: Create your own open source project
There’s quite a lot of good programming related media, i.e. books, talks, etc. I’ve gone over some good programming reading before. Here’s some more options
Talks are a great way to get info about specific technologies, general philosophies on development or even on the history of programming. Here’s some of my favorite talks:
- Performance Matters by Emery Berger
This is the perfect combo of real world programming combined with mostly rigorous math. Plus it’s just entertaining. Even if you don’t care about performance, you should watch this talk.
Gary Bernhardt talks are always a good bet. This talk manages to be funny, interesting and remarkably prescient. You could argue that it anticipates both WASM and Docker.
I just watched this and oh man it’s great. Hilarious, informative and a good wake-up call for those of us who are guilty of some STEM-chauvinism.
concurrency works. It’s an incredibly powerful concept and important
Rob Pike has quite a few good talks. He isn’t always right about certain topics *cough* GOPATH *cough* but he’s undeniably wise and always has something useful to say. I hear far too many people confuse parallelism with concurrency. You should be able to rattle off an example of a parallel but not concurrent and a concurrent but not parallel program.
Every good language should have a philosophy. I agree with some parts and disagree with others, but I have to respect the clarity and coherence to Go’s philosophy.
But these are just the beginning! If you want more, search around Hacker News or /r/programming for posts on the best talks.
I’ve talked about blogs before in my reading post. Here’s a quick recap of blogs you should consider reading:
For general software development: Coding Horror, Joel on Software, Steve Yegge, Dan Luu
For insanely niche info on Windows and other Microsoft products: The Old New Thing
For functional programming: Lambda the Ultimate, Alexis King
For startup, Lisp and other technology: Paul Graham.
Some lists: Austin Z. Henley, Jeff Atwood
My additions to the list:
- Coders At Work
- The Soul of a New Machine
- Smart and Gets Things Done
- Structure And Interpretation of Computer Programs
- How To Design Programs
- Watch some movies! Kanopy is free for NYU students. Some
recommendations on Kanopy:
- Three Colors: Blue
- Three Colors: White
- Three Colors: Red
- Pather Panchali
- Cleo from 5 to 7
- Il Posto
- La Notte
- Read some non-technical books!
- Cook! J. Kenji Lopez-Alt, Bon Appetit, Serious Eats and NYT Cooking are great resources for cooking. I’ve also started reading Salt Fat Acid Heat which teaches the fundamentals wonderfully. Maangchi is great for Korean food too.