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
and JavaScript to visualize what happens when you run your code. This idea was inspired by Bret Victor's "Learnable
Programming", and you can read more about it in the blog [0]. The code is also publicly available [1].
I'm a JavaScript developer (just made a career change from law...) but I'm interested in dipping my toes in the water with "low level" languages. It's intimidating for someone like myself who is self taught with no CS degree or formal training.
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. :)
And I know how scary and complex it can look, but in the end it's not that much harder compared to JavaScript or Web development. It's just different, but just as fun, and my goal here is to show that it doesn't have to be intimidating!
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).
Thanks! I haven't thought about it, but yeah, since the content is also published under the Creative Commons license, any derivative works would be very welcome. The only catch is that it takes a lot of time to create new lessons. :)
Great. One other thing I think you could add if not already is not cover all the topics yourself but also create a kind of roadmap of high quality resources with some order of steps to take the resources in.
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
content."
I have a question for the Rust community, especially those doing low level development now.
As someone who does embedded and systems programming in C for about twenty years (technically i'm not 40 yet ;-)), were the cited problems (lack of documentation, support and tools) really problems that kept from doing low level work? If not, what was it then?
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.
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"?
Yes, but these paths are likely to be loosely connected, i.e. these lessons are designed to be self-contained.
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?
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 second this - I come from a self-taught background and have been moving down the stack since and am 80% through the Rust Programming Language book. I am very excited with this and am happy to help where I can :)
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.
This is great! I'm not much of a programmer yet, but I can feel the underlying urge grow stronger by the day. Getting my copy of Unix Network Programming today in the mail, will definitely be checking this course out.
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.[0]
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?
> How do you indicate which code is under which license?
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!
Hi Nikita, this is a fantastic idea. I've have been working with low level programming for a long time and would love to contribute new lessons. How can I do that?
I am a bit late to the party, but as it happens some top universities have made some of their systems programming courses publicly available, and if you want to get into systems programming, these free options are much deeper, comprehensive, and come with extensive coding assignments that include tests and have been crafted by talented TAs over many years, to help keep you on the straight and narrow:
[1] 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)
[2] 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.
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.
Thanks for this great list of resources, I might add these links in a section like "Further reading / More resources"!
> 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.
If you are trying to find future customers, I might me one. I'm immensely interested in moving lower and lower down the abstraction layer for education purposes. I'd definitely be interested in taking these courses.
Somewhat related but not exactly related to Low-Level Academy, you might be interested in "Nand2Tetris" if you're interested in studying low level concepts for education purposes.
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 and JavaScript to visualize what happens when you run your code. This idea was inspired by Bret Victor's "Learnable Programming", and you can read more about it in the blog [0]. The code is also publicly available [1].
Any feedback is welcome.
Thank you!
[0]: https://lowlvl.org/blog/explorable-programming
[1]: https://github.com/lowlevelacademy