[Edited for formatting]<p>When I find gaps, I have a tendency to build projects.<p>The lower the level of the project, the more low-level parts I find myself needing to explore.<p>A recent rabbit hole:<p><pre><code> - I designed a template/scripting language.
- I wanted it to be a library (dynamically-linked, .so) for use by other programs, so I had to figure out how to do that. That took me down a rabbit hole of the problems of compiling against libraries not globally installed, the compiled program, and their respective paths relative to the compilation directory. In short, using Makefiles and compile targets into any directory other than the current directory causes problems.
- What about making the library globally-installable? That's the rabbit hole of how versions work in libraries and the symlinks required, as well as how Ubuntu locates libraries.
- How to responsibly install and uninstall libraries.
- How to make multiple libraries coexist from the same project.
- How to make the library compile flags integrate nicely (pkg-config)
</code></pre>
My current rabbit hole: writing a HTTP/1.1/2/3 client/server library, which is necessitating a deep-dive into TLS communication and reading a bunch of RFCs.<p>I'm thinking that most low-level or implementation details would be a candidate for a deep dive. In CS, we have a tendency to focus on the abstractions and leave the implementation details to someone else. For example, most people understand zip files, but markedly fewer would be able to write a compression/decompression algorithm.<p>Other examples I can think of:<p><pre><code> - File formats: jpg, png, gif, pdf, etc...
- Large project best practices (exceptions, memory management, source code file layout). Context: most students have only seen 1- or 2-file projects in a single directory, and have never worked on something that other people also need to work on.
- Native application development (not using QT, for example)
- Window/desktop managers
- Device drivers
- Date/time storage and representation (not just timezones and DST, but time massively in the past or future. Dates vs timestamps, etc.)
</code></pre>
Probably not the direction that you are thinking, but I love this low-level stuff!