#8: First half of collaborative filtering, done!