From my own experience: Last semester, I participated in a "Linux Kernel
Hacking Lab" which involved some smaller tasks (write a module which
presents a circular buffer in /proc; the same as char device; write
a very minimalistic file system, extend it to do something resembling
journalling, ...) and a larger project.
The first two tasks were easily done by reading Linux Device Drivers;
but after the file system task (2 weeks), more than half of the group
dropped out; probably because to get this task done you needed to dig at
least in the minix code.
The project I was later involved on was writing a file system, which
stores blocks with the same content only once. In a two months period
(with other lectures to attend to), we managed to produce such a thing;
but it was very unreliable (which reminds me, I am supposed to publish
the results of this project here)
Most problems resulted of a combination of not enough documentation
(filesystem/page cache/block device interaction) and "not digging deep
enough, so the kernel does not really do what we expected".
So, the code produced in this learning phase is not usable; but I
learned a lot from this. Restarting from scratch now would probably
yield some working code.
At least, know I understand why Linux has such a high rate of changes ;)
I probably would not have attended a lab titled like this ;)
--