Suppose we are trying to communicate over a 'noisy channel'. I want to send you a single bit, a 1 or a 0, but there is some probability that the bit I send is not the bit you receive. We could communicate more reliably by agreeing to repeat the intended message, for example, instead of sending '0’ or '1’, I would send '000’ or '111’. But, there is a cost to this repetition. A major goal in the theory of error-correcting codes is to understand how to efficiently build redundancy into messages so that we can identify and correct errors. In this talk we will focus on error-correcting codes that come from families of polynomials over finite fields, starting from the classical example of Reed-Solomon codes. We will emphasize connections between coding theory, algebraic geometry, and number theory. This talk will assume no previous familiarity with coding theory or algebraic geometry. We will start with the basics and emphasize concrete examples.