You’re a high school student who is interested in computer science. Maybe you’ve done some programming already. Maybe you’ve taken a couple classes at your high school. Maybe you’re a total beginner1. How do you judge CS programs?
Why Are You Qualified? In short, I’m not. This is equally a rumination on CS program quality as much as a prescriptive guide.
The long answer is that I’ve spent a lot of time2 thinking about undergraduate CS program quality because I recently graduated from a program that appears prestigious on paper but was, in my opinion, worse than schools with a tenth of the reputation.
We’ve seen these posts before: “I’m 13 and I’m learning Rust”, “I’m 15 and I built a website”, “I’m 20 and I’m the king of Macedon”. They’re kind of nice! It’s great seeing someone so young doing such interesting work. I certainly didn’t have the knowledge or ambition to accomplish what some of these developers have done.
And I should really leave this on that positive note, but every time I see one of those posts, I get this…itch, this…discomfort.
There’s been a lot of ink spilled about how packages are evil and npm will bring about the end of days. I’ve responded to these critiques before, but I realized there’s more to say. While I don’t disagree that large dependencies cause issues ranging from security holes to serious single points of failure, I think it’s important that we recognize why packages are so popular and helpful. Any purported solution will need to satisfy these constraints and not just condescendingly claim that these benefits don’t matter.
I’ve been trying to get better at reading code. It’s an important skill. Too often people neglect this skill, struggle to read other people’s code, and then accuse the code of being poorly written. Sometimes the code is poorly written, but, as Joel Spolsky points out, sometimes the problem is just inherently messy. Not to mention, the source code is the most up to date documentation. If you’re having trouble using a library, reading the source code can clear up a lot of issues.
Why do companies punish applying late? If a student dares to start their intern application process in January or February, they’re met with a wall of “Sorry, we’ve finished our intern hiring process for the year”. Why is that? It’s not like earliness beyond all reasonableness is an inherently good quality. Plenty of great applicants apply late, whether due to exigent circumstances (cough COVID cough), ignorance of timescales, or laziness.
I felt like I wasn’t living up to this blog’s name, so here’s a manifesto about mathematics, something about which I know very little.
We should engineer mathematics. We must treat mathematics as an engineering discipline. The process of doing math should be the process of writing code.
Mathematics is reaching fundamental limitations with its current techniques and tools. Proofs are exceeding the capacity of a single mind. Verifying arguments is becoming nigh impossible.
Let’s learn some WebAssembly. This guide is intended if you plan on getting nice and intimate with WebAssembly, whether that means writing a back-end for a compiler, hand writing WASM or inspecting the output of an existing compiler. It’s not really that useful if you’re just using Rust/C/whatever compiled to WebAssembly.
I wrote this guide because I’ve spent a lot of time trying to understand the WebAssembly specification for my own projects.
Stop using -m in git. It encourages short, lazy commit messages. It makes it harder to figure out when changes occur. And yes, at some point you will need to track down when someone refactored the parser and introduced a buffer overflow bug.
If I had to guess why people use -m, it’s because git commit by default dumps you into vim. If you don’t use vim, this is a very unpleasant experience (cue the five million memes on quitting vim).
This story starts with structs. I had been making some progress with my programming language, Saber. I had implemented functions, control flow, local variables, basically enough to get a factoral function written.
However Saber needed more than just the basics. I wanted structs, strings, all the nice complicated types that we take for granted. For that I needed dynamic allocation. For that I needed an allocator. But wait, I actually need a garbage collector.
Do yourself a favor. Learn to cook. Not only is it easy, rewarding, fun, intellectually stimulating, attractive, yadda yadda, it’s a pretty essential part of one’s existence. Every human needs to consume food to survive. It might be good to know how to make food.
You don’t have to cook often, although practice will make you better.
Yes, yes, I know you’re too busy creating a company/raising a child/writing a novel to cook.