For the last couple of months, I have been working on a new interactive course to teach systems programming.
Basically, it can be described as "Khan Academy for low-level coding". It is built with Rust and it uses WebAssembly
Programming", and you can read more about it in the blog . The code is also publicly available .
Any feedback is welcome.
A resource like this is just what I need to try it out.
> It's intimidating for someone like myself who is self taught with no CS degree or formal training.
I know what you mean. I don't have a formal training or CS degree either. :)
The road to the top seems quite far.
Low level is where you want to be,
To raise the bar.
We need more people with low level understanding of how everything works and how to do it from scratch (so that we can ultimately make things simpler to do basic tasks for future programmers and reduce overall complexity).
Keep up the good work!
As there exists lots of material already for TCP/UDP, Rust etc.
"I have always been passionate and curious about systems programming. At a first glance, this
area of knowledge might seem very complicated and even impenetrable for a lot of people.
Thankfully, with Rust, the tide has started to turn: the Rust community has demonstrated that
sometimes the perceived complexity is rooted in the lack of support, tools, and educational
I'm genuinely curious, because when I started it was more things like hardware bugs (yes they do exist) or the general theory of things (like writing a performant scheduler or file system) that seemed hard to me.
I wonder if someone could write a Programming from the Ground Up style book and use WASM instead of x86 Assembly.
That's a first module, and I will keep adding more lessons, at least for UNIX process control (fork(2) and friends) and memory allocation.
> Programming from the Ground Up
This looks like a great resource, thanks!
As someone that doesn't know anything about low level, I am hestitant to jump into any of these lessons because I have this idea in my mind that there is a proper order that one should learn the concepts in. Is that true? If so, will you have learning "paths"?
There are some common basic topics, or “prerequisites”, but these will also have their own self-contained “path” / module to explain things like binary numbers or how memory works. It’s also very likely that I’ll do a separate module for Rust as a programming language.
Are there ways that others can support this work?
> Are there ways that others can support this work?
There's one important thing I'd very much like to add: accessibility. I've yet to find a good way to make this work in more environments (e.g., with screen readers).
Other than that, any help would be very much appreciated: translations, code fixes, sponsorship, and, of course, your feedback. :)
I really want to make some sort of sre/distsys/ops training ground to go through a mixture of systems design and operational skills (troubleshooting, observability, firedrills) but the interfaces and integrations of the moocs I've tried are so ill-fitting for the task and the good options (which I can't think of right now, there's one that'll integrate into aws/gcp and give you "playgrounds") are too expensive for a lone dev- they're full on corporate training grounds (are they any good? never used one).
There are "k8s/cluster playgrounds" and what not but they're so not operationally-forward in most cases, just extremely basic and not really relative to a day in the life of a cluster/systems operator at all.
I like how you've set this up, I actually want to go through the lessons, great work.
It looks like your code is dual-licensed between MIT and Apache. How do you indicate which code is under which license? Also, just a heads up, it looks like you need to update the Apache template with current dates and your name.
I appreciate you making this material open-source. Do you plan to add a CONTRIBUTING.md to instruct those who want to help to understand how to start?
You can apply either of these licenses at your choice, that's how it usually works with MIT/Apache. This is to maximize compatibility with other open source licenses. And thanks for the heads-up, I will fix this too.
> Do you plan to add a CONTRIBUTING.md to instruct those who want to help to understand how to start?
Since there's some interest in this, I'm definitely going to add it!
> How can I do that?
You can drop me an email (it's in my profile), I would be happy to help you with this.
 Operating Systems Engineering:
MIT 6.828 (in C and a bit of x86 assembly, 2011 has videos for all lectures, bad image but outstanding content)
 Distributed Systems Engineering: MIT 6.824 (2020, in golang)
[3, 4, 5] Database Engineering: MIT 6.830 from OCW (2010, Java), complement with Pavlo's youtube videos and Stonebraker TA notes.
 Security Engineering: MIT 6.858 (2020, web, python, C, assembly, etc)
[7, 8] Computer Networks: Stanford cs144, get videos from youtube, assignments from their website (in C/ C++)
 Compilers: Stanford, the website has all videos and assignments (in Java or C++, RISC target)
 Software Performance Engineering: MIT 6.172 (2018 in OCW, in C/C++ and a bit of x86 assembly)
No hip new languages or platforms, but if you are new to this I think it's better to focus first on battle tested concepts and approaches, from a curriculum that was fine tuned by top universities and professors (many of which made significant contributions to the field) over the years, then the bleeding edge stuff will be a walk in the park, because you will have learned what the tradeoffs are and where innovations are coming from.
As for prereqs, if you are a confident programmer, you can dive right in (6.004 is good but not essential, 6.033 is a bit of a slog on your own with all that paper reading and that brick of a book, and no programming, it is good but I found it just too hard to stay interested, skipped that part, but the videos in youtube are an excellent intro to systems design and concepts, I recommend you watch them first). But better if you know your algorithms first (do the excellent MIT 6.006), specially for 6.172 (the mantra here is to get your algos right before attempting any other kind of optimization), and maybe the database (hashes, trees and dynamic programming come in handy) and compiler courses (graph coloring for register allocation, for instance).
But, whatever you do, start with 6.828 operating systems, this is considered the MIT intro course to systems programming, and they explicitly avoid all but the most basic algorithms, in order not to distract from the core system concepts. More sophisticated approaches are introduced in the second half, once you've got the basics under your belt.
> these free options are much deeper, comprehensive, and come with extensive coding assignments
There's no doubt that university courses are more deep and comprehensive, but my goal is not to compete with them or replace them, but rather complement them with practical exercises and visual explanations -- just like Khan Academy complements the school maths curriculum, even though thousands of comprehensive and deep books existed for centuries.
I am delighted that you liked the list.