I think the most reliable way to understand a system is to directly implement the internals of a library.
In particular, hands-on experience with networks and file systems is incredibly helpful when writing high-level code.