I have written a couple different ray tracers in my wanderings.
Some that "work" in 4D, others that try to run in real time. But mainly its just given me enough experience to add generic ray-object intersection code into my support library. It turns out to be pretty useful.