Submitted by Corey Pennycuff on
For every aspiring programmer and every student looking to improve his or her programming skill, I offer this list of my personal selection of websites that have both helped me, challenged me, and inspired me to improve the skill of my craft. Each page is meant to be a portal to an ocean of knowledge that I hope you will find of interest. They are in no particular order.
Kilo project
Kilo: Build Your Own Text Editor
Kilo is a command line text editor, written in 1,000 lines (hence the name) of C. That's not the reason that I list it here, though.
This page shows you, step by step, how to build the editor from an empty file. Here is the first code block:
int main() { return 0; }
It builds from there, and each step leaves you with a compilable product at each step. It is excellent for learning how to build a non-trivial project incrementally, and you will be exposed to many ideas and tools along the way.
build-your-own-x
build-your-own-x
build-your-own-x is a list of links to tutorials and projects that, for a specified language, demonstrate how to build the non-trivial tool in question. Kilo (mentioned above) is actually in this list, too, but it was significant enough and done in such a helpful way that I wanted to call special attention to it.
These collections of instructional pages pull back the curtain on how the tool works, and although they are not necessarily feature complete tools, they are a the framework for understanding the bigger picture. Don't just use software that someone else provides... Understand it!
Oh... and check out the pull requests. There's more there!
Awesome Falsehoods
Awesome Falsehood
Every programmer has preconceptions about how they think that things work. This is a list of lists of things that many programmers get wrong. Before you jump into a project, see if there is a list of falsehoods that you need to take into account. "An email address can't have more than one `@` in it and be correct," and "There's no reason to store fractional cents for US currency," are some of the things you might find that you are mistaken about.
Visualizing Algorithms
Visualizing Algorithms
Mike Bostock is the author of the D3.js library. He also wrote an amazing blog post about Visualizing Algorithms that you should read. First, you will see algorithms presented in a clear, pleasing manner, with accompanying code. Second, the range of algorithms covers the familiar to the specific in a narrow domains, and yet I'm positive that you will learn something that you haven't seen before!
The most important reason to read this page, though, is the reason that the page itself exists: It it to demonstrate how vitally important a visualization is to the understanding of the reader. It demonstrates that more than one visualization may be necessary in order to capture the nuance that is required. And it does all of this beautifully.
Nandgame
Nandgame
"Modern computers are just a bunch of 1's and 0's." "Modern computers are just a bunch of transistors." These are common phrases, but the truth is that many programmers still see the CPU as some magic box that takes code that they write and dumps something to the screen. They don't really understand how electricity does the work, and even if they have taken a logic design class, it is often so early in their CS journey that they don't have a good context or framework with which to understand the depth of the material.
Now consider Nandgame. This simple, browser-based game has you begin with a simple NAND gate and build each component necessary until a computer itself is created.
There are other resources along this line that I would also recommend, such as the book But How Do It Know? which is an in-depth look into the concepts that the game covers, How a CPU Works which demonstrates the ideas from the BHDIK book, and Ben Eater's series on YouTube where he builds a CPU from TTL logic chips on a really large breadboard layout. All of these are fantastic resources to explore!
Red Blob Games
Red Blob Games
Red Blob Games is always on my list of sites to tell people about. It give beautiful, interactive examples of math and algorithms that help you to develop an intuition of the subject matter. A few pages in particular that I want to draw attention to:
- Hexagonal Grids - is a guide for how to implement a hexagonal grid reference system. It gives visualizations. It gives interactive demos. It gives code. But the most impressive feature is that it points out that hexagonal grids may be implemented as either flat-top or pointy-top cells, and every visualization, demo, and code sample will change depending on whether you want to know the details of flat-top or pointy-top. Then, it gives an Implementation Guide with code in C++, JavaScript, Python, Java, and TypeScript. The quality of this work is astounding, and it is free. I am amazed...
- Polygonal Map Generation For Games - Again, another deep dive into a subject, where the details and resources make this stand head and shoulders above any other site that I have seen on the matter.
Conclusion
This is my list of websites that to me have stood out as truly exceptional value for what they asked of me (nothing), so much so that I have enthusiastically encouraged my students, co-workers, and friends to read through on more than one occasion. My only fear is that I have accidentally forgotten some beautiful jewel of a reference, but if I do happen to remember it, I will add it to the list.
Now, go and build something amazing!