Implementing a programming language was one of the most rewarding things I did at university. The knowledge gained around coding a recursive descent parser actually proved useful in my professional life. As did the lessons in patience from deciphering the professors reference implementation.