Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

I wish the author went into more detail about how to come up with "high leverage side projects" that help cultivate the type of fundamental CS knowledge he emphasises.

Most of the suggestions I see for potential side projects are for some kind of consumer-facing (web/mobile/desktop) app - probably because most people in this context are prioritising the potential of generating side income, but this sounds more like what the author calls "plumbing" style backend/API work rather than something that would develop fundamental CS skills.

So, any ideas? I've seen https://github.com/danistefanovic/build-your-own-x which is a great collection of ideas all based on piercing an abstraction by building your own version of lower-level tools. Are there any other categories of side project that someone who wants to move technically deeper than a full-stack web app would do well to consider?



(Author here)

Nand2tetris is pretty awesome if you don’t already have strong CS fundamentals and feel like you “know how computers work”. If you had a good C.S education though you may not get much out of it.

Here is a cool one I worked on awhile ago when I wanted to learn more about foundationDB: https://github.com/richardartoul/tsdb-layer

A long time ago I wanted to learn about regular expression engines so I wrote a tiny one: https://github.com/richardartoul/regex-engine

I built this with some friends a few years ago: https://hyperdash.io/ (building the backend for this was a good learning experience and I learned a lot about writing multi threaded software making the python SDK).

Those are just some examples to give you an idea, but to be honest it’s hard to give a good answer because side projects are deeply personal.

It takes serious discipline and motivation to spend your nights and weekends writing code when that’s how you spend your working hours as well, so it’s really gonna be about what motivates you and will keep you engaged while also gaining “high leverage” skills (anything fundamental in the realm of networking, compilers, databases, data structures, etc. basically anything that’s not just another language or framework)


I have heard of Nand2tetris, but I always thought it fell more into the 'read a textbook' bucket than the 'do your own technically challenging project to reinforce the learning' one. But I guess it's a project-based textbook, which kind of blurs the lines.

Thanks for sharing those examples. I guess the common thread here is to work on _building_ things that exist at lower levels of abstraction, rather than just knowing how to use them as a black box. I guess most project ideas that satisfy that criteria would teach some fundamental skills too.


Did you make use of Anki or anything similar to maintain the knowledge?


Is that a flash card thing? I think if you’re actively trying to “retain” knowledge like that you’re probably doing something wrong.

For context I studied biochemistry in college with the intention of being pre-med and that is how I did all my studying, creating notes and flash cards for rote memorization because memorizing trivia is what’s required to succeed in that path, but I think it’s the wrong approach for furthering your education as a software engineer.

I still take notes today sometimes (because the act of writing helps me absorb information), but I’d never go as far as making flash cards.

When you’re studying this stuff I think the goal is more like, learn about what’s “out there” so you know enough to recognize that there is a thing whose details you should look up when needed.

Let me put it this way, if you read a textbook cover to cover on operating systems you won’t (and don’t need) to remember every little detail of the data structures and algorithms involved. But studying it once means you’ll never forget that they exist or what the difference between a thread and process is, and the remaining details are always a short lookup away when you need them!

If you do want to go really deep on a topic than my recommendation would be read about it / study it first, then go implement something in that area (even if it’s just a toy) if you want to make sure you really understand it.


It's definitely worth understanding what Anki is. It goes beyond flash cards and there's a body of research showing its efficacy: https://alchemist.camp/learning-machine/spaced-repetition-sy...

That said, I still have basically the same opinions you do when it comes to when it comes to using it for most programming skills. Others have a different perspective, though: https://www.semicolonandsons.com/episode/how-to-learn-to-cod...


Is that a flash card thing? I think if you’re actively trying to “retain” knowledge like that you’re probably doing something wrong.

It's a spaced repetition flash card program. If you just want flash cards, you use quizlet.

For context I studied biochemistry in college with the intention of being pre-med and that is how I did all my studying, creating notes and flash cards for rote memorization because memorizing trivia is what’s required to succeed in that path, but I think it’s the wrong approach for furthering your education as a software engineer.

Understanding is always preferable to pure brute force memorization. For one thing, going through flash cards will be much faster, easier, and less frustrating.

If you don't understand a concept, it's going to create leeches, which suck up study time.

I still take notes today sometimes (because the act of writing helps me absorb information), but I’d never go as far as making flash cards.

It helps you absorb information and convert it to knowledge, yes. But decay of knowledge is a thing. Flash cards are just the format. What it allows you to do is formulate questions or prompts which allow you to practice active recall. Active recall of information is one of the gold standard for studying.

If you do want to go really deep on a topic than my recommendation would be read about it / study it first, then go implement something in that area (even if it’s just a toy) if you want to make sure you really understand it.

Simply reading is one of the poorest strategy for learning. Active recall is much better. I agree that implementation and actual practice of skill is a good use of time, which might fall under the category of active recall.

Anyway, I am still trying to find how anki fit in my overall system for learning programming / software engineering. One of the thing I lacked is technical vocabularies for describing what I am seeing or doing, which I think anki can help with a lot.

Some people has success with it, but not for me. I suspect that it has to do something with the low density of cards/notes I added to anki.


Mochi[0] might be interesting to you. It mixes zettelkasten-style note cards with SRS flash cards and markdown.

[0] https://mochi.cards/


Take a look at https://web.eecs.utk.edu/~azh/blog/challengingprojects.html and https://web.eecs.utk.edu/~azh/blog/morechallengingprojects.h... for some good summaries.

For me, I started building programming languages (and standard libraries) years ago as personal challenge and to learn more about how various languages work. Later on that branched into emulation (x86/amd64, armv8/aarch64) and more recently databases. (You can find these kinds of projects on my github).

Before that when I was more focused on web tech, I'd build clones of React or Bootstrap or Flask to increase my understanding there.

It helped being surrounded by people with a lot more experience than I so I'd keep being in a situation where I knew nothing about some field and wanted to not be embarrassingly naïve :D so I'd try to build something from scratch to learn it.

It doesn't always work out! An example of a topic I haven't yet been able to get into is the TCP/IP stack. I got somewhere into the IP layer on top of userland raw sockets but TCP complexity and may poor C skills failed me as the algorithms needed for tracking state came up.


I think your reply reinforces a conclusion I drew from the OP's reply - that the common thread here is to work on _building_ things that exist at lower levels of abstraction, rather than just knowing how to use them as a black box. And in building things, I guess you learn the ins and outs of how they work, which makes you better at using them?

Thanks for the examples. I'd never even think of being able to build my own programming language, or clone of Flask - which I guess is the point, I shouldn't treat these things like black boxes :)


Yeah by building stuff you come to understand that all abstractions are arbitrary but you also come to understand why previous projects picked the abstractions they did. So it helps even just as a user, you don't have to be building frameworks, languages, databases professionally to benefit here.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: